在JavaScript中创建新对象
我是JavaScript中面向对象编程的新手,我不确定在JavaScript中定义和使用对象的“最佳”方式。我已经看到了定义对象和实例化新实例的“规范”方法,如下所示在JavaScript中创建新对象,javascript,javascript-objects,Javascript,Javascript Objects,我是JavaScript中面向对象编程的新手,我不确定在JavaScript中定义和使用对象的“最佳”方式。我已经看到了定义对象和实例化新实例的“规范”方法,如下所示 function myObjectType(property1, propterty2) { this.property1 = property1, this.property2 = property2 } // now create a new instance var myNewvariable = new m
function myObjectType(property1, propterty2) {
this.property1 = property1,
this.property2 = property2
}
// now create a new instance
var myNewvariable = new myObjectType('value for property1', 'value for property2');
但我已经看到了以这种方式创建新对象实例的其他方法:
var anotherVariable = new someObjectType({
property1: "Some value for this named property",
property2: "This is the value for property 2"
});
我喜欢第二种方式——代码是自我记录的。但我的问题是:
提前感谢。好吧,第二种方法看起来不错,对于有很多设置选项的“类”来说很有用。但是,请注意,在这个过程中,您实际上正在构建另一个对象 我建议您阅读一个或另一个Javascript框架中的代码,并找到一种吸引您的风格。1)无论如何,我认为方法2更适合我。具有2个属性的示例没有那么大的不同,但是如果您想这样做,该怎么办:
var anotherVariable = new someObjectType({
property1: "Some value for this named property",
property2: "This is the value for property 2"
//Leaving several properties out, don't want them populated
property8: "This is the value for property 8"
property9: "This is the value for property 9"
});
想一想,为了处理第一个方法提供给对象的属性,您必须处理多少个重载组合(或跟踪null
s)。这是一种更具扩展性和灵活性的方法
2) 只要允许它使用一个空的构造函数,这将使实例化更干净
3) 长度/可读性,尤其是对于多个对象。看看JSON,它非常干净/可读,至少对我来说是这样,如果你喜欢这种风格,那么创建对象数组的方法在方法2中看起来非常相似。这完全取决于你的品味。这样:
var anotherVariable = new someObjectType({
property1: "Some value for this named property",
property2: "This is the value for property 2"
});
。。。如果有2/3以上的参数,通常效果更好,因为它有助于可读性,并且更容易避免可选参数问题(fn(null,null,null,123')
)
另一个考虑因素是性能。以传统方式传递参数会更快,但这种速度增益只有在性能非常敏感的情况下才会变得显著
我可以用第二种方法实例化一个对象类型的变量吗?这个对象类型是用隐式构造函数定义对象类型的“经典”方法定义的
不容易。如果您想通过使用散列而不是仅仅传递参数来实例化构造函数,并且您无法控制源,那么您可以“包装”它:
不过,我并不建议仅仅为了风格而使用第三方API
如果我想创建这些对象的数组,还有其他考虑吗
阵列有多大?这个数组的确切用途是什么?性能可能值得考虑…创建javascript对象的最佳方法是使用new退出(至少如果您订阅crockford camp)
第52页,共页,我强烈推荐:-)几天前有一条关于这方面的好线索。按照惯例,建议将“object”函数的第一个字母大写<代码>新函数(){…}完全错误!使用factory/builder函数很好,但是
新函数…
是非常错误的。@SeanMcMillan说它是错误的,只有当你带参数时才有用:)@GôTô:公平newfunction(){…}
将创建一个从匿名函数原型派生的新对象,并使用匿名函数对其进行初始化。您最终实例化了一个不需要的对象。老实说,我觉得这是个打字错误。无论哪种方式,obj.testing
都将是一个对象,而不是一个函数,警报将在创建时运行,而不是作为方法运行。实例化一个new
匿名函数与仅仅分配一个新对象({}
)是完全多余的。@SeanMcMillan顺便说一句,我知道它被弃用了,不知道为什么。谢谢
var _constructor = SomeConstructorFunction;
SomeConstructorFunction = function(hash) {
return new _constructor(hash.property1, hash.property2);
};
myObjectType = function(props) {
// anything defined on props will be private due to the closure
props.privateVar = "private";
// anything defined on obj will be public
obj = {};
obj.testing = new function() {
alert(props.privateVar);
};
return obj;
};
instance = myObjectType({prop1: "prop"});
// if we want inheritance, it just means starting with the base type instead of
// a new object
subType = function(props) {
obj = myObjectType(props);
obj.subTypeProperty = "hello.";
return obj;
};