范围可以从父范围继承。
范围(原型)从其父范围继承属性。
那么,子范围是否始终从其父范围继承原型?有例外吗?当它继承时,它是否总是正常的JavaScript原型继承?
答案 0 :(得分:139)
我绝不想与Mark的回答竞争,但只是想强调最终使所有内容都成为Javascript inheritance and its prototype chain的新用户。
只有属性读取搜索原型链,而不是写入。所以当你设置
时myObject.prop = '123';
它不会查找链,但是当你设置
时myObject.myThing.prop = '123';
在写入操作中有一个微妙的读取,试图在写入其道具之前查找myThing。这就是为什么从子节点写入object.properties会获取父节点的对象。
答案 1 :(得分:20)
我想用javascript向@Scott Driscoll回答添加一个原型继承的例子。我们将使用经典的继承模式与Object.create(),这是EcmaScript 5规范的一部分。
首先我们创建" Parent"对象功能
function Parent(){
}
然后将原型添加到" Parent"对象功能
Parent.prototype = {
primitive : 1,
object : {
one : 1
}
}
创建"儿童"对象功能
function Child(){
}
分配子原型(让子原型从父原型继承)
Child.prototype = Object.create(Parent.prototype);
分配适当的"儿童"原型构造函数
Child.prototype.constructor = Child;
添加方法" changeProps"一个儿童原型,它将重写"原始" Child对象中的属性值并更改" object.one" Child和Parent对象中的值
Child.prototype.changeProps = function(){
this.primitive = 2;
this.object.one = 2;
};
启动父(爸爸)和子(子)对象。
var dad = new Parent();
var son = new Child();
调用Child(son)changeProps方法
son.changeProps();
检查结果。
父原始属性未更改
console.log(dad.primitive); /* 1 */
Child原始属性已更改(已重写)
console.log(son.primitive); /* 2 */
父和子对象。一个属性已更改
console.log(dad.object.one); /* 2 */
console.log(son.object.one); /* 2 */
此处的工作示例http://jsbin.com/xexurukiso/1/edit/
有关Object.create的更多信息https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/create