JS __proto__继承替换

时间:2011-03-01 16:38:50

标签: javascript inheritance prototype

我正在使用https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/Proto

中描述的原型继承
function MyString(data){this.data = data ;}
MyString.prototype = { data : null,
 toString: function(){ return this.data ;}
} ;

MyString.prototype.__proto__ = String.prototype ;

现在我可以在MyString实例上使用String函数和MyString函数。

但由于__proto__已弃用,非标准且应该避免,继承对象的最佳方式是什么?

我找到了http://ejohn.org/blog/simple-javascript-inheritance/,与单行代码相比,它看起来仍然有点复杂,有点过分:)

编辑:谢谢你的回答!

3 个答案:

答案 0 :(得分:6)

ECMAScript 5规范包含一个新函数Object.create(),允许您使用特定原型创建通用对象。要获得您想要的行为:

MyString.prototype = Object.create(String.prototype)
MyString.prototype.toString = ....

Object.create可用于创建任意长的原型链,只需链式返回值即可。不幸的是,它没有让我们能够改变现有对象的原型链(因此它不能解决数组“继承”问题)

答案 1 :(得分:4)

大概:

MyString.prototype = new String;

完成此操作后,您可以使用您的方法扩充原型:)

答案 2 :(得分:1)

当你说:

MyString.prototype.__proto__ = String.prototype ;

您说运行时应该查看String.prototype的{​​{1}}属性,这些属性未直接在MyString.prototype中声明。但这是一种迂回的方式来说明你尝试说什么,MyString.prototype实例应该具有与{{1}相同的属性和方法}}。

你这样说:

MyString

String是对象实例的属性。它是返回到作为该实例原型的对象的运行时链接。另一方面,MyString.prototype = new String(); 是构造函数的属性。它是使用该构造函数创建的所有对象的模板。