更改对象__proto__属性的正确方法
The correct way to change object __proto__ property
我非常了解javascript原型继承,但我有一个类似于角度scopes
的情况,我不知道如何处理它。
让我们从错误开始(因为更改__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);
如您所见,我需要一种方法来创建某种具有一些属性的scope
。稍后我需要创建其他scope
它将继承前一个。我的意思是,如果未在当前范围内定义属性,它将从父级中获取。
但是我不知道如何更改此行:new_scope.__proto__ = this;
我想你正在寻找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 中进行了标准化,因此不鼓励直接操作。
首先,
使用 dunder proto 不是一个好的做法,有 setPrototyOf 用于该原因
设置原型
当然,除非您需要支持较旧的IE版本。
现在请记住,在设置原型后,您还需要再次设置构造函数。所以正确的是new_scope。原型 = 这个原型;new_scope。proto.constructor=this.prototype.constructor
相关文章:
- electronic BrowserWindow的最小高度和宽度在hide()show()方法之后不起作用
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 数组在递归方法中设置为null
- 打破承诺链的好方法是什么
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- 使用“;这个“;JavaScript原型方法中的关键字
- 序列化数据属性中对象的最可靠方法
- 使用Objective-C的JavaScript注入方法
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 有没有一种方法可以防止img get请求使用css或js发生
- Javascript,有没有一种方法可以将数组写成没有逗号或空格的单个文本字符串
- toBoolean方法类似于toString
- 如何在单击复选框后调用控制器方法
- 是否有任何方法可以使用jQuery替换在数组中定义值的文本
- 递归使用 eval() 是检查程序执行的好方法吗?
- 如何在webView,Android中从@JavascriptInterface方法调用Javascript
- toLocaleDateString和toLocaleString方法不尊重机器时区
- 有条件更新d3.js力图中节点的最佳方法
- TypeError:在不兼容的接收器nodejs上调用了方法Uint8Array.length
- jQuery插件-从插件中调用公共方法