Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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 - Fatal编程技术网

JavaScript简单对象继承

JavaScript简单对象继承,javascript,Javascript,我们正在使用一个以对象为参数的小部件。我想要一些对象继承之王来定制小部件。默认设置应该是默认值,然后继承对象(添加和更新属性),该对象应该提供所需的对象,如下面的代码所示 defaultSettings = { setting1 = "setting1 value"; setting2 = "setting2 value"; } customSettings = { setting2 = "setting2 value - custom"; //Ov

我们正在使用一个以对象为参数的小部件。我想要一些对象继承之王来定制小部件。默认设置应该是默认值,然后继承对象(添加和更新属性),该对象应该提供所需的对象,如下面的代码所示

defaultSettings = {

     setting1 = "setting1 value"; 
     setting2 = "setting2 value"; 

}

customSettings  = {

     setting2 = "setting2 value - custom";  //Overwrite defaultSettings 2    
     setting3 = "setting3 value";  //New Setting 

}

finalObject = {

    setting1 = "setting2 value - custom"; 
    setting2 = "setting2 value"; 
    setting3 = "setting2 value"; 
} 

在问这个问题之前,我已经在谷歌上搜索过了,但不确定这是实现这一目标最有效的技术吗

如果您使用的是Node.js,那么可以使用
util.inherits(构造函数、超级构造函数)
。 如果您不是,以下是一些依赖于库的文档:

  • 原型:
  • jQuery:

实现可能会有所不同(例如,深度复制),因此我建议您在将其标记为准备生产之前对其进行彻底测试。

继承通常不是您所描述的方法。相反,您通常使用具有默认值的对象:

var defaults = {
   setting1: "default1",
   setting2: "default2",
   setting3: "default3"
};
…然后让函数接受一个对象,该对象可能具有这些属性中的任何一个(或没有),然后构建一个组合结果,如下所示:

function apiCall(o) {
    var options = {};
    var key;

    for (key in defaults) {
        options[key] = defaults[key];
    }
    for (key in o) {
        options[key] = o[key];
    }

    // ...then use `options` here...
}
function extend() {
    var rv = {},
        key,
        source,
        index;

    for (index = 0; index < arguments.length; ++index) {
        source = arguments[index];
        for (key in source) {
            rv[key] = source[key];
        }
    }

    return rv;
}
这是一种常见的模式,许多库都有相应的函数,例如

通用
extend
接受任意数量的对象(每个对象优先于前一个对象)如下所示:

function apiCall(o) {
    var options = {};
    var key;

    for (key in defaults) {
        options[key] = defaults[key];
    }
    for (key in o) {
        options[key] = o[key];
    }

    // ...then use `options` here...
}
function extend() {
    var rv = {},
        key,
        source,
        index;

    for (index = 0; index < arguments.length; ++index) {
        source = arguments[index];
        for (key in source) {
            rv[key] = source[key];
        }
    }

    return rv;
}


但是,如果您对JavaScript中的继承感兴趣,我创建了一个新的方法来简化它,并定期打开(包括继承)。

您可以设置默认值​​在类中,如果传递值​​, 该类采用这些值

var foo = function (settings){
    this.Settings = settings || {};

    this.Settings.a = this.Settings.a  || 'Default';
    this.Settings.b = this.Settings.b  || 'Default'
    console.log(this.Settings)
}

//default
var test = new foo(); //Object {a: "default", b: "default"}

//custom
var settings = {
    a:'a', 
    b:'b'
};
var x = new foo(settings); // Object {a: "a", b: "b"}


//add new settings
x.Settings.c = 'test';

console.log(x.Settings); // Object {a: "a", b: "b", c: "test"}

给你:这个的副本?使用或仅查看为什么
setting1
获得
setting2
的值的来源?请注意,这仅在您首先(手动)将设置哈希转换为面向对象的代码后才有效。