我知道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
答案 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
除非你需要支持旧的IE版本。
现在请记住,在设置原型之后,您还需要再次设置构造函数。 所以正确的是 new_scope。 proto = this.prototype; new_scope。的原强> .constructor = this.prototype.constructor