【发布时间】:2013-04-13 11:40:59
【问题描述】:
我想使用原型继承新的对象实例。
测试用例:
var MyObj = function() {}
MyObj.prototype.objName = {}
// I want this to be a different object for each instance of MyObj
var o1 = new MyObj (),
o2 = new MyObj ();
o1.objName['a'] = 1;
o2.objName['a'] = 2;
alert(o1.objName['a']) // 2
alert(o1.objName === o2.objName) // true
这意味着原型中的对象不是作为它的副本继承而是作为它的引用。
我知道通常你可以这样做。
var MyObj = function() {
this.objName = {}
}
var o1 = new MyObj(),
o2 = new MyObj();
alert(o1.objName === o2.objName) // false
这很好用,但在我的情况下,这不是一个选项。我确实需要在 MyObj 函数之外定义 objName。
我设法“解决”了这个问题
MyObj.prototype.objName = function() {
if ( this._objName === undefined ) {
this._objName = {};
}
return this._objName;
}
var o1 = new MyObj(),
o2 = new MyObj();
o1.objName()['a'] = 1;
o2.objName()['a'] = 2;
alert(o1.objName()['a']) // 1
但这不是很漂亮,而且这段代码的性能要差得多。
有什么方法可以更优雅地解决这个问题吗?
【问题讨论】:
-
为什么要在构造函数之外定义
objName? -
我正在制作一个库,允许用户使用某些功能扩展他的对象,我需要在他的对象中添加一些对象以支持附加功能。我不想通过强迫他自己声明这些属性来打扰用户。我希望我能理解地解释自己:)
-
您为什么认为性能会很多变差?当然,还有一个额外的函数调用,但如果你不想使用构造函数,你不能阻止它。
-
根据 www.jsperf.com 的数据,性能降低了 76%。
标签: javascript oop prototype