将构造函数原型添加到javascript对象

Wil*_*ilt 18 javascript methods object extending

我有几个像这样的javascript对象:

var object = {
    name: "object name",
    description: "object description",
    properties: [
        { name: "first", value: "1" },
        { name: "second", value: "2" },
        { name: "third", value: "3" }
    ]
};
Run Code Online (Sandbox Code Playgroud)

现在我想将这些对象更改为更智能的对象(添加一些方法等).
起初我做了一个像这样的构造函数:

SmartObject = function( object ){

    this.name = object.name;

    this.description = object.description;

    this.properties = object.properties;

};

SmartObject.prototype.getName = function(){
    return this.name;
};

SmartObject.prototype.getDescription = function(){
    return this.description;
};

SmartObject.prototype.getProperies = function(){
    return this.properties;
};
Run Code Online (Sandbox Code Playgroud)

然后我使用这个构造函数将我的对象更改为这样的SmartObject实例:

var smartObject = new SmartObject( object );
Run Code Online (Sandbox Code Playgroud)

这似乎是正确的面向对象的javascript代码,但这感觉非常复杂,因为我实际想要做的是添加一些方法,现在objectSmartObject在构造函数中将所有属性从my复制到my .

在这个例子中,只有3个属性和一些简单的方法,但在我的项目中有几十个(嵌套的)属性和更复杂的方法.

那么我试过这个:

object.__proto__ = SmartObject.prototype;
Run Code Online (Sandbox Code Playgroud)

这似乎导致完全相同的结果,似乎更容易(检查这个例子的小提琴).

这是将原型添加到我的对象的正确和可接受的方式吗?或者这是破坏面向对象的模式并被认为是不好的做法,我应该像我一样继续做(使用构造函数).

或者是否有另一种更可接受的方法将方法添加到现有对象而不通过构造函数拉动它?


注意.我试图在StackOverflow上找到这样的例子,但是当我搜索时,我总是在示例中扩展现有javascript类的原型.如果有这样的问题,请随意将其标记为副本,我将再次关闭我的问题.

Seb*_*iel 11

正如我之前提到的,更改对象的原型会对代码的性能产生严重影响.(tbh,我从来没有花时间来衡量影响).这个MDN页面解释道.

但是,如果您的问题与样板有关,则可以轻松地为对象创建通用工厂,例如:

function genericFactory(proto, source) {
    return Object.keys(source).reduce(function(target, key) {
        target[key] = source[key];
        return target;
    }, Object.create(proto));
}
Run Code Online (Sandbox Code Playgroud)

现在你可以通过传递你的SmartObject.prototypeobject像这样的参数来使用它:

var smartObject = genericFactory(SmartObject.prototype, object);
Run Code Online (Sandbox Code Playgroud)