我正在使用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/,与单行代码相比,它看起来仍然有点复杂,有点过分:)
编辑:谢谢你的回答!
答案 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();
是构造函数的属性。它是使用该构造函数创建的所有对象的模板。