我们知道scope是可以继承的.scope的继承和js原型链是同一个概念。

    <div ng-controller="parentCtrl">
{{name}}
<div ng-controller="childCtrl">
{{name}}
</div>
</div>

在angular中,ng-controller指令会帮我们创建一个scope并继承它的父亲scope .

parentCtrl scope继承自 $rootScope , childCtrl scope 继承自parent scope.

app.controller("parentCtrl", function ($scope,$rootScope) {
$scope.name = "keatkeat";
});
app.controller("childCtrl", function ($scope) { });

所以即使我们在childCtrl没有给 name 赋值,模板依然可以从parentCtrl 读取到"keatkeat".

继承对于子层读取父亲属性值非常良好和简单。但是在写就不那么方便了!

比如

app.controller("childCtrl", function ($scope) {
$scope.name = "xinyao";
});

当我们在子层填"xinyao"时,你会发现这个值确实在子层的模板出现了,而父亲模板依旧是原来的"keatkeat"

孩子可以覆盖父亲,这也许是我们想要的。

但也有这种情况

app.controller("parentCtrl", function ($scope,$rootScope) {
$scope.name = {
first: "keat",
last: "keat"
}
});
app.controller("childCtrl", function ($scope) {
$scope.name.first = "xin";
$scope.name.last = "yao";
});

当父亲的值是个对象时,就要特别小心了。$scope.name.first = "xin"; 会修改掉父亲的值!

所以对于原型链来说,孩子是有"机会"修改掉父亲的值的。

如果你不熟悉js 可能会不太能理解,其实原理是很简单的

你可以把 $scope.name.first = "xin"; 看成这样

var obj = $scope.name; //读取name属性,在子层没有,所以会去父层找,并且找到了一个对象

obj.first = "xin";  //你写入的自然是父层的对象咯,所以也就覆盖了父亲啦 .

这其实也挺好的!善加利用的话,孩子可以修改父亲的值也很方便。

那么是不是只有对象才可能这样呢。

如果只是 $scope.name = "keatkeat"; 就不可能被子层修改了吗?

大部分情况是!但是也有例外!

比如

app.controller("parentCtrl", function ($scope, $rootScope) {
var _name = "keatkeat";
Object.defineProperty($scope, "name", {
get: function () { return _name },
set: function (newValue) { _name = newValue }
});
});
app.controller("childCtrl", function ($scope) {
$scope.name = "xinyao";
});

父亲的name是加了setter的属性, object.defineProperty是ECMA5 的新功能。

一但这样,孩子就无法在添加自己的name属性了,它会直接调用父亲的name做读写!

善加利用的话还是不错的!

总结 : angularjs的scope是单纯的js对象,继承也是单纯的js继承(原型链),所以呢不要感觉它很神奇很神秘,你要去了解它才能把它发挥出来 ^^

Angularjs Scope 原型链的更多相关文章

  1. js原型链闭包作用域链-Tom

    1.原型相当于Java.C++里面的父类,由封装公有属性及方法而产生,子类可以继承. 原型继承实现(函数的原型属性指向原型函数一个实例对象,函数的原型的构造函数指向函数本身) 1)eg:原型链 fun ...

  2. JavaScript 构造函数 prototype属性和_proto_和原型链 constructor属性 apply(),call()和bind() 关键字this

    1.构造函数: 通常构造函数首字母需要大写,主要是为了区别ECMAScript的其它函数.(高程三 P145) 构造函数与其他函数的唯一区别,就在于调用它们的方式不同.只要通过new来调用,任何函数都 ...

  3. 你不知道的JavaScript--Item15 prototype原型和原型链详解

    用过JavaScript的同学们肯定都对prototype如雷贯耳,但是这究竟是个什么东西却让初学者莫衷一是,只知道函数都会有一个prototype属性,可以为其添加函数供实例访问,其它的就不清楚了, ...

  4. javascript prototype原型链的原理

    javascript prototype原型链的原理 说到prototype,就不得不先说下new的过程. 我们先看看这样一段代码: <script type="text/javasc ...

  5. js通过沿着作用域链还是原型链查找变量

    这是一道非常典型的JS闭包问题,结果和具体的解析请看这里. 对于其中的`函数作用域链的问题`博主似乎没有解释清楚,有一些疑问:js中的变量到底是沿着作用域链还是原型链查找呢? 首先,要分清作用域链与原 ...

  6. JS核心系列:浅谈原型对象和原型链

    在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对象(Function). 一般而言,通过new Function产生的对象是函数对象,其他对 ...

  7. 简单粗暴地理解js原型链--js面向对象编程

    原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...

  8. Js 原型和原型链

    Js中通过原型和原型链实现了继承 Js对象属性的访问,首先会查找自身是否拥有这个属性 如果查到,则返回属性值,如果找不到,就会遍历原型链,一层一层的查找,如果找到就会返回属性值 直到遍历完Object ...

  9. 深入浅出JavaScript之原型链&继承

    Javascript语言的继承机制,它没有"子类"和"父类"的概念,也没有"类"(class)和"实例"(instanc ...

随机推荐

  1. [Design Pattern] Flywight Pattern 简单案例

    Flywight Pattern, 即享元模式,用于减少对象的创建,降低内存的占用,属于结构类的设计模式.根据名字,我也将其会理解为 轻量模式. 下面是享元模式的一个简单案例. 享元模式,主要是重用已 ...

  2. Hadoop集群与RAID磁盘阵列

    Hadoop集群规范 硬盘选型 尽管建议采用RAID(Redundant Array of Independent Disk,即磁盘阵列)作为NameNode的存储器以保护元数据,但是若将RAID作为 ...

  3. E - Minimum Cost - POJ 2516(最小费)

    题目大意:N个客户,M个供货商,K种商品,现在知道每个客户对每种商品的需求量,也知道每个供货商每种商品的持有量,和供货商把一种商品运送到每个客户的单位花费.现在想知道如果能满足所有客户的最小花费是多少 ...

  4. css中居中的居中方法

    1:给div设置一个宽度,然后添加margin:0 auto属性 div{ width:200px; margin:0 auto; } 2:居中一个浮动元素 确定容器的宽高 宽500 高 300 的层 ...

  5. ios将一个项目完全导为另一个项目(tool)

    --前言:有时开始一个新项目,但新项目跟已做完的一个项目很类似,基本可以在原有项目上更改.这个时候,可以new一个新project,在将相应的代码文件copy到新的project,配置工程各参数,库等 ...

  6. 在终端(Terminal)里用命令行进行数学运算

    有时候我们进行一些数学运算,我们会去开系统自带的计算来做这件事情,其实我们也可以直接在终端里面用命令行进行的. 在命令行里敲 bc 进入数学计算模式,然后随便输入数学表达式 回车 ,结果就出来了,是不 ...

  7. MySQL高可用基础之keepalived+双主复制【转】

    环境:MySQL-VIP:192.168.1.3MySQL-master1:192.168.1.1MySQL-master2:192.168.1.2 OS版本:CentOS release 6.4 ( ...

  8. 使用Intent实现Activity的显式跳转

    [正文] 这里以按钮实现活动跳转为例,为实现这个功能,我们需要三个步骤: 1.点击按钮才发生页面跳转,因此,第一步我们先要找到要点击的按钮 如何拿到按钮对象呢?通过资源id,前面我们提到过,在R.id ...

  9. css position 应用(absolute和relative用法)

    1.absolute(绝对定位) absolute是生成觉对定位的元素,脱离了文本流(即在文档中已经不占据位置),参照浏览器的左上角通过top,right,bottom,left(简称TRBL) 定位 ...

  10. shell 数组(in_array)

    if [[ ! "${array[@]}" =~ $val ]] ; then fi