AngularJS中范围原型/原型继承的细微差别是什么?

时间:2012-12-27 04:48:31

标签: javascript angularjs inheritance prototype prototypal-inheritance

API Reference Scope page说:

  

范围可以从父范围继承。

Developer Guide Scope page说:

  

范围(原型)从其父范围继承属性。

那么,子范围是否始终从其父范围继承原型?有例外吗?当它继承时,它是否总是正常的JavaScript原型继承?

2 个答案:

答案 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