实际上,事实证明这是可能的,尽管是以非标准的方式.
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不提供复制它们的方法.如果不诉诸不兼容的技巧,就无法重新创建字符串,数字,函数等.
实际上,事实证明这是可能的,尽管是以非标准的方式.
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.
简短的回答:不可能.
这行代码:
var d = new c();
自动假设这d
是一个对象.除非c
是内置对象的构造函数,例如Function
.但是如果c
已经由语言定义,你就无法操纵它的原型,也不能从你喜欢的任何东西"继承"它.好吧,在一些口译员中你可以,但是你不能安全地在所有口译员中做到 - 标准说:"你不会弄乱标准物品,或者翻译会打击你!".
内置对象是"唯一的",JavaScript不提供复制它们的方法.如果不诉诸不兼容的技巧,就无法重新创建字符串,数字,函数等.