当前位置:  开发笔记 > 编程语言 > 正文

JavaScript对象可以有一个原型链,但也可以是一个函数?

如何解决《JavaScript对象可以有一个原型链,但也可以是一个函数?》经验,为你挑选了2个好方法。

实际上,事实证明这是可能的,尽管是以非标准的方式.

Mozilla,Webkit,Blink/V8,Rhino和ActionScript提供了非标准__proto__属性,允许在创建对象后更改对象的原型.在这些平台上,可以使用以下代码:

function a () {
    return "foo";
}

a.b = function () {
    return "bar";
}

function c () {
    return "hatstand";
}
c.__proto__ = a;

c(); // returns "hatstand"
c.b(); // returns "bar"; inherited from a

这可能对任何不需要担心跨平台兼容性的人都有用.

但请注意,只能继承对象的属性.例如:

var d = {};
d.__proto__ = a;
d.b(); // returns "bar"
d(); // throws exception -- the fact that d is inheriting from a function
     // doesn't make d itself a function.


Eugene Lazut.. 8

简短的回答:不可能.

这行代码:

var d = new c();

自动假设这d是一个对象.除非c是内置对象的构造函数,例如Function.但是如果c已经由语言定义,你就无法操纵它的原型,也不能从你喜欢的任何东西"继承"它.好吧,在一些口译员中你可以,但是你不能安全地在所有口译员中做到 - 标准说:"你不会弄乱标准物品,或者翻译会打击你!".

内置对象是"唯一的",JavaScript不提供复制它们的方法.如果不诉诸不兼容的技巧,就无法重新创建字符串,数字,函数等.



1> Daniel Cassi..:

实际上,事实证明这是可能的,尽管是以非标准的方式.

Mozilla,Webkit,Blink/V8,Rhino和ActionScript提供了非标准__proto__属性,允许在创建对象后更改对象的原型.在这些平台上,可以使用以下代码:

function a () {
    return "foo";
}

a.b = function () {
    return "bar";
}

function c () {
    return "hatstand";
}
c.__proto__ = a;

c(); // returns "hatstand"
c.b(); // returns "bar"; inherited from a

这可能对任何不需要担心跨平台兼容性的人都有用.

但请注意,只能继承对象的属性.例如:

var d = {};
d.__proto__ = a;
d.b(); // returns "bar"
d(); // throws exception -- the fact that d is inheriting from a function
     // doesn't make d itself a function.



2> Eugene Lazut..:

简短的回答:不可能.

这行代码:

var d = new c();

自动假设这d是一个对象.除非c是内置对象的构造函数,例如Function.但是如果c已经由语言定义,你就无法操纵它的原型,也不能从你喜欢的任何东西"继承"它.好吧,在一些口译员中你可以,但是你不能安全地在所有口译员中做到 - 标准说:"你不会弄乱标准物品,或者翻译会打击你!".

内置对象是"唯一的",JavaScript不提供复制它们的方法.如果不诉诸不兼容的技巧,就无法重新创建字符串,数字,函数等.

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有