Javascript:如何从对象定义(如类)正确创建新的自定义istance

时间:2018-01-12 11:11:55

标签: javascript class prototypejs

由于IE11,我发现仍然无法自由使用class

所以我想使用prototypesobject.create来尽可能以最轻的方式创建我的问题。 但是我只发现Object.assign()var classDefiner = { x: 1, y: 2, standardFunction : function() { return this.x+this.y; } }; var istance = Object.assign({}, classDefiner ,{ x: 10, z: 3, customFunctionA : function() { return this.x+this.y+this.z; }, customFunctionB : function() { return this.x/this.y; } }); 合并,这是一种对象的合并,而不是一个inizializator。

classDefiner

老实说,这听起来只是{} prototypesclass所有方法的冗余副本。 不能很好地使用object.create(){}class。 这是正确的方式还是我可以改进的东西?

PS:挑战是不要声明任何单个函数/方法,而是使用istance的{​​{1}}包装器和istance.newMethod的另一个包装器,以便于阅读。我知道我可以使用newobject.prototype.newMethod甚至{{1}}手动添加许多方法。但是如果要添加大量方法,这将是漫长而混乱的。

2 个答案:

答案 0 :(得分:1)

我猜你的意思是:

function classDefiner() {
   this.x = 1;
   this.y = 2;
};

classDefiner.prototype.standardFunction = function() {
       return this.x+this.y;
}

var a = new classDefiner();

a.standardFunction(); //3

答案 1 :(得分:1)

如果您想通过复制属性来实现,那么您使用Object.assign所做的事情可能就像现在一样干净。 (请注意,您必须在IE11上填充Object.assign,但它是完全可填充的。)一个调整是您可以使用方法语法而不是函数的属性初始化语法:

var instance = Object.assign({}, classDefiner ,{
    x: 10,
    z: 3,
    customFunctionA() {                 // ***
        return this.x+this.y+this.z;
    },
    customFunctionB() {                 // ***
        return this.x/this.y;
    }
});

ES2018将为我们提供在上面替换Object.assign的语法:

var instance = {
    ...classDefiner,                    // ***
    x: 10,
    z: 3,
    customFunctionA() {
        return this.x+this.y+this.z;
    },
    customFunctionB() {
        return this.x/this.y;
    }
};

(当然,如果不进行转换,这将无法在IE11上运行。:-))技术上the proposal for it目前只是第3阶段,但它可能是在第4阶段之后的第4阶段1月TC39会议,已在V8(在Chrome中)和SpiderMonkey(在Firefox中)实施。

如果您想通过继承来实现这一目标,那么您使用Object.create走在了正确的轨道上:

var classDefiner = {
   x: 1,
   y: 2,
   standardFunction() {
       return this.x+this.y;
   }
};

var instance = Object.assign(Object.create(classDefiner), {
    x: 10,
    z: 3,
    customFunctionA() {
        return this.x+this.y+this.z;
    },
    customFunctionB() {
        return this.x/this.y;
    }
});

// Demonstrating it
console.log(instance.standardFunction());
console.log(instance.customFunctionA());

无论是复制属性还是继承属性,我都会说无论是哪种方式都没有。

赞成继承:

  • 如果创建instance之后,您添加或修改了classDefiner,则这些更改将反映在instance中(因为它继承而不是复制)。
  • 技术上可能会稍微减少内存使用继承而不是复制属性,但除非你做了数百万这些,否则你不会关心它。

赞成复制:

  • ESP。在上面提到的属性扩展表示法中,语法更简洁。不过,您可以使用包装函数来完成。
  • 理论上,使用继承属性与复制的“自有”属性可能存在 最小的 额外开销,但我怀疑你需要关注的任何事情现代JavaScript引擎。
相关问题