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

标签 javascript

我非常了解 javascript 原型(prototype)继承,但我遇到了类似于 Angular scope 的情况,我不知道如何处理它。

让我们从错误开始(因为更改__proto__属性是个坏主意)但是工作示例

https://jsfiddle.net/hxm61r7j/

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);

如您所见,我需要一种方法来创建某种具有某些属性的范围。稍后我需要创建其他范围,它将继承前一个范围。我的意思是,如果属性未在当前范围内定义,它将从父级获取。

但我不知道如何更改这一行:new_scope.__proto__ = this;

最佳答案

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

此函数允许您创建一个新的 JavaScript 对象,并将内部原型(prototype)属性 (__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 中标准化,因此不鼓励对其进行直接操作。

关于javascript - 更改对象 __proto__ 属性的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30575618/

相关文章:

javascript - After Effects 对象模型是否可用于在 Adob​​e ExtendScript Toolkit 之外进行测试?

同一文档中的 PHP GET 变量

javascript - 如何循环并构建 IP 地址

javascript - 无法从javascript中的数组中获取键和值

javascript - 将 v-model 与数组一起使用时,从 vue.js 收到无法读取未定义属性的错误

javascript - 用ajax json根据 `id`获取数据的值

javascript - 是否可以忽略 AngularJS v1.4.5 的 jquery-2.2.4 JQMIGRATE 警告并升级 AngularJS?

javascript - 我应该接受来自dependabot 更新yarn.lock 的自动PR 吗?

javascript - 使用javascript将多个数组迭代为对象

javascript - 如何使用 Javascript 获取元素的不透明度?