为什么会导致继承?
我在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
然后他们自然可以访问各种$scope
实例。
这是准确的吗?
它被设置为原型,尝试CONSOLE.LOG
$scope.__proto__.rootyThing
,你应该看到它在那里。
此外,对象是通过在javascript参考所以它不事关时$范围设定 例如
//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
所有作用域上$rootScope
对象添加。如果您在$rootScope
上添加了一个属性(例如someProperty),并且您尝试使用$scope.someProperty
访问该属性,则会检查该属性是否存在于$scope
(即当前范围)中。如果该属性不存在,则将在范围链中的较高级别上进行检查(即$rootScope
)。
在AngularJs,据我所知,范围是从父作用域继承,所有的变量,但如果u有一个同胞范围那么这些值不会被继承。广播是为事件完成的。
所以,Angular的工作原理是一样的。如果你已经在$ rootScope上设置了一些可以在整个App中访问的变量。
ng-controller
将创建一个new Scope
。
这个示波器的原型被设置为parent Scope
(即,e,$rootScope
在这种情况下)
而这是默认的JavaScript行为,看在原型链如果我们正在寻找的属性没有在对象中找到。