我们知道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] DAO Pattern 简单案例

    Data Access Object Pattern, or DAO Pattern, 即 DAO 模式,用于分离底层的数据访问接口,已经上层的业务逻辑. 下面是 Dao 模式的一个简单的案例. St ...

  2. Firefox中firebug和xpath checker工具的使用

    一直想把自己这段时间做的东西整理下,确迟迟没有动手,现在信息抽取工作已经做的差不多,把自己感觉很好用的两个工具介绍给大家吧!    Firefox真是一个好东西,它许多插件.本人是很讨厌插件的,每次电 ...

  3. SQL语句查询结果额外加入一列序号自己主动添加

    sqlserver 能够用row_number函数实现 例如以下: SELECT *,row_number() OVER(ORDER BY score(列名) DESC) AS rank FROM s ...

  4. url参数中有+、空格、=、%、&、#等特殊符号的处理

    url参数中有+.空格.=.%.&.#等特殊符号的问题解决? 解决办法: 将这些字符转化成服务器可以识别的字符,对应关系如下: URL字符转义 + URL 中+号表示空格 %2B 空格 URL ...

  5. Thinkpad Edge E440 Ubuntu14.04 无线网卡驱动 解决

    http://ubuntuforums.org/showthread.php?t=2190347 正文: Thinkpad Edge E440 安装 Ubuntu12.04 后 无法使用无线网卡, 须 ...

  6. [转] GDB 下 watch的使用

    这里大概说下gdb调试程序时,watch的使用.至于原理尚不清楚,以后再做补充,还请见谅. watch通常需要和break,run,continue联合使用. 下面举例说明: 代码如下: #inclu ...

  7. 超好用文件对比工具 – Beyond Compare

    超好用文件对比工具 – Beyond Compare,开发中文件.目录对比神器,有了它,再也不用为找不到修改的内容而发愁了. 具备的丰富实用功能: 并列比较文件夹.FTP 网站或 Zip 文件: 为以 ...

  8. Install the OpenStack command-line

    Install the OpenStack command-line Install the prerequisite software python 2.7 or later note: Curre ...

  9. Windows下将硬盘由MBR转为GPT

    打开命令提示符,输入 diskpart 进入diskpart提示符.Win7/Vista用户可以直接在开始菜单的搜索框中输入diskpart回车即可打开diskpart提示符. 在diskpart提示 ...

  10. Error: theForm.submit is not a function !!

    theForm.submit is not a function 调试了半天,才发现范了低级错误. 页面中有一个按钮ID 是 submit 而引发的错误. 引出的问题是页面上的元素命名范围不能是 wi ...