一、AngularJS作用域详解
1.$rootScope
AngularJS作用域本质上就是一个普通的JavaScript对象,与普通的JavaScript一样,不同的是不需要手动去构造作用域对象,当HTML页面出现
ng-app
和
ng-controlle
r指令时,AngularJS框架会自动创建作用域对象,只需要注入即可
每个AngularJS应用至少有一个
$rootScope
,它是AngularJS应用的根作用域,事实上
$rootScope
是所有作用域的父作用域(孤立作用域除外)
当AngularJS启动时会自动创建一个
$rootScope
,接着当使用
ng-controller
指令实例化控制器对象时,AngularJS框架会为我们创建一个子作用域
$scope
,默认情况下,该
$scope
会继承
$rootScope
的所有属性
-------------------------------------------------controller.js----------------------------------------------------
var app=angular.
module
("app",[]);
app.
controller
('FirstController',function(
$scope
,
$log
){
$log.info("FirstController->"+$scope.name);
$log.info("FirstController->"+$scope.age);
});
------------------------------------------------------app.html---------------------------------------------------
ng-app
="app">
angularjs
ng-init
="name='jane';age='23'">
ng-controller
="FirstController">
--------------------------------------------------------------------------------------------------------------------
2.可以在ng-controller指令所在范围内使用另一个ng-controller指令实现作用域嵌套,后者会继承前者的作用域
二、AngularJS的作用域继承
1.JavaScript对象继承机制
严格来讲,JavaScript并不是一门面向对象语言,而是一门基于对象的语言
1.1.JavaScript构造对象
(1).通过字面量创建
var obj= {name:'Schuyler',age:'33'};
(2).通过构造方法
function Person(name,age){
this.name=name;
this.age=age;
this.eat=function(){
console.log("eat...");
}
}
----------------
var person=
new
Person("Schuyler",33);
1.2.构造方法原型链继承
每个JavaScript构造器方法都有一个
prototype
属性,可以指向另一个对象,当
我们访问对象属性时,JavaScript引擎会从对象的所有属性中查找该属性,如果没有
找到就继续从
prototype
属性指向的对象中查找,如果仍没有找到,则会沿着
prototype
链一直查找下去,直到
prototype
链结束或找到对象为止
--------------------------------------------------------------------------------------------------------------------
angularjs
function Animal(){
this.eat=function(){
console.log('eat..');
}
}
function Cat(age){
this.age=age;
}
Cat.
prototype
= new Animal();
var cat=new Cat(10);
console.log("cat.age="+cat.age);
cat.eat();
--------------------------------------------------------------------------------------------------------------------
1.3.使用apply、call方法实现继承
JavaScript构造方法的
apply()
、
call()
方法可以改变对象构造中的"this"的上下
文环境,使特定对象的实例具有对象构造中所定义的属性、方法,因此我们可以使用
apply()
、
call()
方法实现JavaScript对象的继承
--------------------------------------------------------------------------------------------------------------------
angularjs
function Person(name,age){
this.name=name;
this.age=age;
}
function Student(name,age,love){
//Person.
apply(this,[name,age])
;
Person
.call(this,name,age)
;
this.love=love;
}
var student=new Student("Schuyler",23,"code");
console.log("student.name="+student.name);
console.log("student.age="+student.age);
console.log("student.lpve="+student.love);
--------------------------------------------------------------------------------------------------------------------
1.4.对象实例间继承
Object.create()
方法是以一个对象为原型创建另一个对象,创建的对象和原型具
有相同的属性,我们可以通过
Object.getPrototypeOf()
方法获取新对象的原型
--------------------------------------------------------------------------------------------------------------------
angularjs
function Person(name,age){
this.name=name;
this.age=age;
}
var person = new Person('jane',28);
var student =
Object.create(person)
;
student.love="pingpong";
console.log(
Object.getPrototypeOf(student)
);
console.log("student.name->:"+student.name);
console.log("student.age->:"+student.age);
console.log("student.love->:"+student.love);