假设您正在创建数据类型并公开其行为。
您能否举例说明何时使用:
-
一个功能和新功能:
// define new data type
var CustomDataType= function(){
this.a='whatever';
this.doX= function(){/*some code*/};
}
// create a new instance of our custom data type
var obj= new customDataType();
-
对象字面量 & Object.create:
// define new data type
var customDataType = {
a: 'whatever',
doX: function(){/*some code*/}
}
// create a new instance of our custom data type
var obj= Object.create(customDataType);
-
构建对象的函数:
function customDataTypeFactory(options){
return {
a: 'whatever',
doX: function(){/*some code*/}
}
};
// create a new instance of our custom data type
var obj= customDataTypeFactory(options);
我觉得这可能会被标记为重复:new
vs Object.create
但我的主要兴趣不是讨论哪一个更好,而是想知道是否存在特定的用例,其中一个应该优于其他用例。
我读过很多关于相关问题的帖子和 Crockford 的书:Javascript:好的部分。到目前为止,我得出的结论是,这是一个偏好问题,尽管克罗克福德的建议与我产生了很大的共鸣:“尽量避免危险和不必要的功能”......我正在谈论new
.
我将从通常定义类的方式开始:
function CustomDataType(a)
{
this.a = a;
this.b = 2;
}
CustomDataType.prototype = {
doX : function () {}
};
var obj = new CustomDataType(1);
我在构造函数中分配变量是因为F.prototype = { a : [1,2,3]; }
是有问题的,除非在构造函数中重新初始化该属性,否则该数组将在实例之间共享(对于所有非基本类型都有问题)。当属性以某种方式依赖于构造函数的参数时,也需要它。我在原型中声明方法,以便它们在所有实例之间共享,如果您使用继承,则意味着您可以进行超级调用,这也会导致更少的内存使用,因为该方法只需分配一次(尽管这可能不是)这是一个大问题)。
我从来没有用过Object.create
,我不认为有任何理由这样做,除非你热衷于一些疯狂的动态黑客行为。
每当感觉没有必要为对象创建单独的类时,我都会使用对象文字,例如,如果它是方法的参数(因此调用者不必显式实例化某些内容),或者如果它是一些不应访问的内部值由其他任何人。
您的工厂本质上与对象字面量相同。我想如果您需要创建一些 jsonesque 结构并设置一些默认值,它会很有用。
我不明白为什么new
是危险的或不必要的,他是在什么背景下说的?
但我认为很大程度上取决于品味。保持一致,不要使事情复杂化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)