Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复制和修改用于实例化javascript的类似对象_Javascript_Design Patterns_Object - Fatal编程技术网

复制和修改用于实例化javascript的类似对象

复制和修改用于实例化javascript的类似对象,javascript,design-patterns,object,Javascript,Design Patterns,Object,我有一个物体看起来像 var customObject = function() { this.property = "value"; }; customObject.prototype = new otherObject(); customObject.prototype.property2 = function() {}; 等等-它比这个大得多 我可以通过编写new customObject()成功实例化该对象 现在我想创建一个非常相似的对象,尽管有点不同。这涉及到修改某些属性

我有一个物体看起来像

var customObject = function() {
    this.property = "value";
};

customObject.prototype = new otherObject();

customObject.prototype.property2 = function() {};
等等-它比这个大得多

我可以通过编写
new customObject()
成功实例化该对象

现在我想创建一个非常相似的对象,尽管有点不同。这涉及到修改某些属性,甚至可能添加或删除某些属性。与上面的示例一样,我希望通过编写
newcustomobject2()
来调用它

我想我可以简单地做到:

var customObject2 = new customObject();
customObject2.prototype = customObject.prototype;
customObject2.property = "modified value";
等等

但是,当我尝试通过执行
new customObject2()
来实例化它时,我收到一个错误,指出customObject2不是一个函数


我希望我能很好地说明我想要创建的模式。我应该采取什么方法来创建这样的模式?

我认为。基本上,new关键字返回的是一个对象,而不是一个函数

你为什么不使用第一次使用的公式?例如:

var customObject2 = function(){};
customObject2.prototype = new customObject();
customObject2.property = "modified value";
new customObject2(); // works!

customObject
的所有属性将由
customObject2
的实例通过原型链继承。

如果
customObject
不是宿主对象(即,如果您尝试以与预期不同的方式调用它,则不会给您非法调用错误)您可以将构造函数应用于不同的
对象


向后兼容
对象。创建

function objectWithProto(proto) {
    var f;
    if (Object.create) return Object.create(proto);
    f = function () {};
    f.prototype = proto;
    return new f();
}

看看你的代码,你正在做
customObject2=newcustomobject()
。这应该可以解释为什么它不是一个函数。有什么快速的方法可以得到我需要的吗?或者我应该手动创建一个
var customObject2=function(){}并循环原始
customObject
的所有直接属性,以将它们分配给
customObject2
?不,它没有。我很清楚关键字的作用,但我想知道是否有一种快速的方法可以复制一个对象并使其保持“可实例化”。您是否有一个对象的替代方法。创建一个与旧浏览器兼容的对象?哦,等等:谢谢,这是我一直在寻找的简短解决方案,它避免了简单地扩展
customObject
@user2180613,但这也是扩展customObject,它只是一种不同的技术。@bfavaretto iirc coffeescript将这种风格与他们的
extend
关键字结合使用。我不是在寻找继承。
function objectWithProto(proto) {
    var f;
    if (Object.create) return Object.create(proto);
    f = function () {};
    f.prototype = proto;
    return new f();
}