我正在努力学习面向对象的javascript。我有一个对象构造函数,如下所示:
//generic object
function myObject(value1, value2, value3){
this.value1 = value1;
this.value2 = value2;
this.value3 = value3;
this.method1 =method1;
}
function method1(){
alert('hello');
}
function method2(){
alert('hello again');
}
我正在创建此对象的新实例:
instance1 = new myObject(
1, //value1
2, //value2
3 //value3
)
我的问题是:在myObject的一些实例上,我需要自定义值和方法。我想在创作时添加它们。但我无法弄清楚如何在不重新编写实例名称的情况下这样做,我试图避免这样做,因为它会大大减慢添加新对象的过程。
有没有办法替换这段代码..
instance1 = new myObject(
1, //value1
2, //value2
3 //value3
)
instance1.method2 =method2;
instance1.value4 =4;
..有些东西不需要重复名称“instance1”?
答案 0 :(得分:5)
您可以在MyObject prototype
function MyObject(value1, value2, value3){
this.value1 = value1;
this.value2 = value2;
this.value3 = value3;
this.method1 =method1;
}
MyObject.prototype.update = function( args ) {
for(var name in args) {
this[ name ] = args[ name ];
}
};
//using it
var instance1 = new MyObject( 1, 2, 3 );
instance1.update( {
method2: method2,
value4: 4
});
需要注意的是,我将构造函数的名称从myObject
更改为MyObject
。在JavaScript中,构造函数是带有pascal case而不是camel case的名称。这样,当开发人员看到一个pascal大小的函数时,他们知道他们需要使用new
关键字。您可以在此处阅读更多内容:http://elegantcode.com/2010/12/21/basic-javascript-part-4-enforcing-new-on-constructor-functions/
我还建议新的JS开发人员查看AppendTo.com免费的Learn jQuery and JavaScript
系列http://learn.appendto.com/
答案 1 :(得分:2)
由于您有jQuery可用,因此您可以使用jQuery.extend()
并避免重新输入instance1
。 jQuery.extend()
将属性从一个对象复制到另一个对象。
jQuery.extend(instance1, {
method2: method2
value4: 4
});
这会将第二个参数的所有属性复制到第一个参数中的对象。有关详细信息,请参阅jQuery doc。
如果你想将它指定为构造函数的一部分,你可以这样做,而不需要输入任何额外的代码行:
function myObject(value1, value2, value3, extraProperties){
this.value1 = value1;
this.value2 = value2;
this.value3 = value3;
this.method1 = method1;
if (extraProperties) {
jQuery.extend(this, extraProperties);
}
}
在这种情况下,您只需编码:
var instance1 = new myObject(1, 2, 3, {method2: method2, value4: 4});
当然,更多面向对象的方法是为每个类型的对象创建原型(有些可以从其他对象继承)然后只是实例化正确类型的对象而不是添加特定于实例的方法和属性。
或者,创建一个原型,其中包含对象的所有使用所需的所有方法/功能,而不是添加特定于实例的方法。在javascript中,如果对象上有方法,如果它们在原型上,则有时不会使用它们。原型上的东西是每个实例免费的(每个实例没有存储消耗,每个实例没有初始化成本等等。)。
答案 2 :(得分:0)
function myObject (value1, value2, value3, attributes)
{
$.extend(this, attributes);
// the rest of your code
}
// Usage
var obj = new myObject(1,1,1,{ abc: 123, something: "nothing" });
注意:这不是全球性的。 Aka如果你制作了2个具有不同属性值的对象,那么它们每个都有自己的自定义属性。如果你想让这些属性影响每个对象,请看一下调整它的原型。