Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 向对象添加新方法和值,同时避免重复_Javascript_Jquery - Fatal编程技术网

Javascript 向对象添加新方法和值,同时避免重复

Javascript 向对象添加新方法和值,同时避免重复,javascript,jquery,Javascript,Jquery,我正在努力学习面向对象的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(){

我正在努力学习面向对象的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
)
我正在创建此对象的新实例,如下所示:

//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的东西?

您可以在MyObject原型上创建更新函数

需要注意的是,我将构造函数的名称从myObject更改为myObject。在JavaScript中,有一种惯例,即构造函数是大小写为pascal而不是驼峰大小写的名称。这样,当开发人员看到一个函数是pascal case时,他们知道他们需要使用new关键字。您可以在此处阅读更多内容:


我还建议作为一名新的JS开发人员从AppendTo.com上查看这个免费学习jQuery和JavaScript系列

您可以在MyObject原型上创建一个更新函数

需要注意的是,我将构造函数的名称从myObject更改为myObject。在JavaScript中,有一种惯例,即构造函数是大小写为pascal而不是驼峰大小写的名称。这样,当开发人员看到一个函数是pascal case时,他们知道他们需要使用new关键字。您可以在此处阅读更多内容:


我还建议作为一名新的JS开发人员从AppendTo.com查看这个免费学习jQuery和JavaScript系列

,因为您有jQuery可用,所以您可以使用jQuery.extend并避免重新键入instance1。extend将属性从一个对象复制到另一个对象

jQuery.extend(instance1, {
    method2: method2
    value4: 4
});
这将把第二个参数的所有属性复制到第一个参数中的对象。有关更多信息,请参阅

如果希望将其指定为构造函数的一部分,可以这样做,并且不需要键入任何额外的代码行:

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中,如果对象上有方法,而如果它们在原型上,则有时不使用这些方法,则不会受到惩罚。原型上的东西每个实例都是免费的,每个实例没有存储消耗,每个实例没有初始化成本,等等……

因为您有可用的jQuery,所以您可以使用jQuery.extend并避免重新键入instance1。extend将属性从一个对象复制到另一个对象

jQuery.extend(instance1, {
    method2: method2
    value4: 4
});
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" });
这将把第二个参数的所有属性复制到第一个参数中的对象。有关更多信息,请参阅

如果希望将其指定为构造函数的一部分,可以这样做,并且不需要键入任何额外的代码行:

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中,如果对象上有方法,而如果它们在原型上,则有时不使用这些方法,则不会受到惩罚。原型上的东西每个实例都是免费的,每个实例没有存储消耗,每个实例没有初始化成本,等等

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" });
注意:这不是全局性的。也就是说,如果你制作了两个具有不同属性值的对象,那么它们每个都有自己的自定义属性。如果要使这些属性影响每个对象,请查看如何调整其原型


注意:这不是全局性的。也就是说,如果你制作了两个具有不同属性值的对象,那么它们每个都有自己的自定义属性。如果要使这些属性影响每个对象,请查看如何调整其原型。

为什么选择向下投票?这直接回答了OP提出的一个问题,即在添加新属性时如何避免一次又一次地重新键入instance1?我选择这个作为答案,因为我觉得它最容易理解。对我来说,最有价值的建议可能是,您指出了一种更面向对象的方法来实例化正确类型的对象,而不是添加特定于实例的属性,我认为
这就是我要走的路。为什么要投否决票?这直接回答了OP提出的一个问题,即在添加新属性时如何避免一次又一次地重新键入instance1?我选择这个作为答案,因为我觉得它最容易理解。对我来说,最有价值的建议可能是,你指出了一种更面向对象的方法来实例化正确类型的对象,而不是添加特定于实例的属性,我认为这就是我要走的路。既然已经有了jQuery.extend,为什么还要重新设计更新函数呢?它已经做到了,而且实际上还有更多深度复制、多对象等功能?@jfriend00由于这一行,我正在努力学习面向对象的javascript。$。extend对于JS新手来说有点神奇。我想展示使用原始JavaScript扩展对象的效果。我喜欢教新手实际如何工作,但如果有库可用,我宁愿使用经过验证且功能更强的库函数,也不愿重写自己的库函数。代码也少了。作为有问题的新手,我很欣赏教育我的方式。然而,我很难理解for循环在这个特定答案中的作用。。这使得jQuery的答案对我来说更具吸引力。既然jQuery.extend已经有了更新功能,为什么还要重新设计更新功能呢?jQuery.extend已经有了更新功能,而且实际上还有更多功能—深度复制、多对象等…?@jfriend00因为这一行,我正在努力学习面向对象的javascript。$。extend对于JS新手来说有点神奇。我想展示使用原始JavaScript扩展对象的效果。我喜欢教新手实际如何工作,但如果有库可用,我宁愿使用经过验证且功能更强的库函数,也不愿重写自己的库函数。代码也少了。作为有问题的新手,我很欣赏教育我的方式。然而,我很难理解for循环在这个特定答案中的作用。。这使得jQuery的答案对我来说更具吸引力。它会显著降低添加新对象的过程——它可能会增加您必须执行的键入量,但我不明白为什么它会降低实际执行的速度。您关心的是打字还是执行速度?另外:缩进你的代码@我是说打字速度。这个项目涉及到创建数百个对象,我在打字方面非常熟练:这将大大减慢添加新对象的过程——它可能会增加您必须执行的键入量,但我不明白为什么它会减慢实际执行。您关心的是打字还是执行速度?另外:缩进你的代码@我是说打字速度。这个项目涉及创建数百个对象,我非常擅长打字: