更改对象__proto__属性的正确方法

时间:2015-06-01 14:03:56

标签: javascript

我知道javascript原型继承很好,但我的情况类似于角{"bool":{"must":{"term":{"article.title":["google", "earth"]}}}} ,我不知道如何处理它。

让我们以错误开头(因为改变scopes属性是个坏主意)但是正在运作示例

https://jsfiddle.net/hxm61r7j/

__proto__

如你所见,我需要一种方法来创建某种具有某些属性的function Scope() { } Scope.prototype.$new = function() { var new_scope = new Scope(); //TODO: change line bellow new_scope.__proto__ = this; return new_scope; } // Create root scope var scope_level_1 = new Scope(); scope_level_1.a = 'scope_level_1 a'; scope_level_1.b = 'scope_level_1 b'; // Create scope which inherits from parent var scope_level_2 = scope_level_1.$new(); scope_level_2.b = 'scope_level_2 b'; // We don't have property "a" in "scope_level_2" so it will be taken from "scope_level_1" // But we have property "b" in "scope_level_2" so it will be taken from there console.log(scope_level_2.a, scope_level_2.b); 。稍后我需要创建其他scope,它将从前一个继承。我的意思是如果在当前范围内没有定义属性,它将从父项中获取。

但我不确定如何更改此行:scope

2 个答案:

答案 0 :(得分:1)

我认为您正在寻找Object.create()

此函数允许您创建一个新的JavaScript对象,其内部原型属性(__proto__)设置为您传递给函数的任何对象作为第一个参数:

Scope.prototype.$new = function() {
    var new_scope = Object.create(this);
    // If you also need to call the constructor function:
    Scope.call(new_scope);

    return new_scope;
}

或者,您可以使用Object.setPrototypeOf(),但这是ECMAScript 6的一部分,浏览器支持可能会有所不同:

Scope.prototype.$new = function() {
    var new_scope = new Scope();

    Object.setPrototypeOf(new_scope, this);

    return new_scope;
}

请注意,__proto__属性仅在ES 6中标准化,因此不鼓励直接操作。

答案 1 :(得分:1)

首先使用dunder proto不是一个好习惯,因为这个原因有setPrototyOf

setPrototypeOf

除非你需要支持旧的IE版本。

现在请记住,在设置原型之后,您还需要再次设置构造函数。 所以正确的是 new_scope。 proto = this.prototype; new_scope。的 .constructor = this.prototype.constructor