一、作用域链
Javascript引擎在执行环境对象中访问作用域内的变量,查找的顺序叫做作用域链
1.作用域链示例:
每次调用,regular_joe在作用域内都有定义
//在全局作用域里,设置regular_joe
var regular_joe = "I am here to save the day!";
//调用作用域:全局。作用域链中的最近匹配:全局的regular_joe
//logs 'I am here to save the day!'
console.log(regular_joe);
function supermax(){
var regular_joe = 'regular_joe is assigned';
//调用作用域:全局->supermax()。
//作用域链中的最近匹配:在supermax()中定义的regular_joe
//logs 'regular_joe is assigned'
console.log(regular_joe);
function prison () {
//在javascript中,当变量被声明时,声明会被提升到它所在函数的顶部,
//并被赋予undefined值
var regular_joe;
//调用作用域:全局->supermax()->person()。
//作用域链中的最近匹配:在person()中定义的regular_joe
console.log(regular_joe);
}
//执行person()函数, 'logs'
prison();
}
supermax();
二、原型链
多个对象基于类和原型的比较
基于类的
//step 1: defined class
public class Prisoner {
public int sentence = 4;
public int probation = 2;
public string name;
public string id;
//step 2: defined class struct function
public Prisoner( string name,string id) {
this.name = name;
this.id = id;
}
}
//step 3 实例化对象
Personer firstPrisoner = new Prisoner("Joe","12A");
Personer SecondPrisoner = new Prisoner("Sam","2BC");
基于原型的
//1.定义原型的对象
var proto = {
sentence : 4,
probation : 2
};
//2.定义对象的构造函数
var Prisoner = function(name, id){
this.name = name;
this.id = id;
};
//3.将构造函数关联到原型
Prisoner.prototype = proto;
//4.实例化对象
//使用 Object.create 的常见工厂模式是使用工厂函数来创建并返回最终的对象
//所有的工厂函数我们以make<object_name>的形式进行命名
var makePrisoner = function( name, id ) {
var prisoner = Object.create( proto );
prisoner.name = name;
prisoner.id = id;
return prisoner;
};
var firstPrisoner = makePrisoner( 'Joe', '12A' );
var secondPrisoner = makePrisoner( 'Sam', '2BC' );
说明了javascript是如何使用原型来创建共享相同属性的对象