我有一个看起来像
的对象var customObject = function() {
this.property = "value";
};
customObject.prototype = new otherObject();
customObject.prototype.property2 = function() {};
等。 - 它比这大得多。
我可以通过编写new customObject()
来成功实例化对象。
现在我想创建一个相当类似的对象,虽然有点不同。这涉及修改某些属性,甚至可能添加或删除某些属性。如上例所示,我希望通过编写new customObject2()
来启用它。
我以为我可以这样做:
var customObject2 = new customObject();
customObject2.prototype = customObject.prototype;
customObject2.property = "modified value";
等
但是,当我尝试通过new customObject2()
实例化它时,我收到一个错误,声明customObject2不是函数。
我希望我能够很好地说明我想要创造什么样的模式。我应该采取什么方法来创建这样的模式?
答案 0 :(得分:1)
如果customObject
不是主机对象(即如果尝试以不同的方式调用它,则不会给出非法调用错误),您可以将构造函数应用于其他 this
对象;
var customObject2 = function () {
customObject.call(this); // construct as if `customObject`
// now do more stuff
this.anotherProperty = 'foo';
};
customObject2.prototype = Object.create(customObject.prototype);
// inherit prototype but keep original safe
new customObject2();
向后兼容Object.create
function objectWithProto(proto) {
var f;
if (Object.create) return Object.create(proto);
f = function () {};
f.prototype = proto;
return new f();
}
答案 1 :(得分:0)
我认为this should answer your question。基本上,new关键字是返回一个对象而不是一个函数。
答案 2 :(得分:0)
为什么你没有使用你第一次使用的相同公式?例如:
var customObject2 = function(){};
customObject2.prototype = new customObject();
customObject2.property = "modified value";
new customObject2(); // works!
customObject
的所有属性都将由customObject2
的实例通过原型链继承。