为什么这会导致继承?

时间:2015-03-02 05:24:14

标签: javascript angularjs angularjs-scope

我正在阅读AngularJS中范围继承的this article,并对此代码示例感到困惑:

angular.module("Demo", [])  
  .controller("ChildCtrl", function($rootScope, $scope) {
    $rootScope.rootyThing = "I am groot";
    console.log($scope.rootyThing);  // "I am groot"
    console.log(Object.getPrototypeOf($scope)); // Scope
 });

我不明白为什么设置$scope.rootyThing而不是undefined

文章的解释似乎不完整。儿童范围"原型继承"来自$rootScope的人不会解释这一点,因为原型上没有设置rootyThing,而且在创建子范围$scope之后设置了它。

唯一的解释是,Angular中的范围是否经过深度修改,以便在其上设置的所有变量都广播到现有的子范围。除非我错过了一些东西,否则就超过了。

任何人都能解释一下吗?

修改:我目前的理解是$rootScope 实际上是Scope函数本身而不是实例 Scope,并且所有$scope个实例都将此作为根原型使用,因此当在函数Scope上设置变量时,它们可以自然地被各种{{1}访问实例。

这准确吗?

4 个答案:

答案 0 :(得分:1)

所有范围都添加在$rootScope对象上。如果在$rootScope上添加属性(例如someProperty)并尝试使用$scope.someProperty访问它,则会检查$scope上是否存在此属性(即当前范围)。如果该属性不存在,则将在范围链的更高级别检查(即$rootScope)。

答案 1 :(得分:1)

ng-controller将创建new Scope

此范围的原型设置为parent Scope(即,在这种情况下为$rootScope

如果在对象中找不到我们要查找的属性,那么它是原型链中的默认javascript行为。

Scope inheritance

答案 2 :(得分:0)

设置为原型,尝试console.log

$scope.__proto__.rootyThing

你应该在那里看到它。

此外,对象在javascript中引用,因此在设置$ scope时无关紧要 例如

//say this is your rootScope
objRoot = {
   obj: {
       test: 'hello'
   }
}

//Now lets create a scope
var temp = objRoot.obj

//Update rootScope
objRoot.obj.test = "changed"

//log your temp
console.log(temp.test); //changed

答案 3 :(得分:0)

在AngularJs中,据我所知,范围是从父范围继承的,所有变量,但是如果你有兄弟范围那么这些值将会不被继承。广播是为了举办活动。

因此,Angular正在发挥作用。如果您在$ rootScope上设置了一些可在整个App中访问的变量。