相对于传统的编程语言来说,javascript一直显得不那么直观,尤其是它的Scope、this、对象模型等,无论我看过多少次,长时间不接触就容易遗忘。因此也希望在写此文时能深刻的理解并记住。
function Person(name) {
this.name = name;
}
Person.prototype.sayHello = function() {
alert("Hello, I'm " + this.name);
};
var p = new Person('Aaron');
上面一段代码:
- 声明了一个Person类型
- Person类型一个变量为name
- Person类型有一个方法为sayHello
- 创建了一个Person的全局对象p,参数name为’Aaron’
疑问:
- this是代表什么?
- Person明明是一个函数,为什么是类型?
- Person.prototype是什么?
- 如何给Person声明私有变量或方法?
- 如何去实现继承?
捉摸不定的this
在其他语言中,this就是执行当前方法所使用的对象。其实javascript也差不多,
但是在混乱不清的调用后,我们往往搞不懂this的指向。其实两句话就可以说清:
- 在函数外部,this就是window对象
- 在函数内部,this就是函数的拥有者
第2点也决定了this是不会产生嵌套传递的。这个有个例子:
var name = 'window';
function A() {
alert(this.name);
}
var boy = {name: 'boy'};
boy.B = function() {
alert(this.name);
}
var girl = {name: 'girl'};
girl.C = boy.B;
girl.D = A;
//输出
alert(this.name);//window
A(); //window
boy.B(); //boy
girl.C(); //girl
girl.D(); //girl
- 全局定义的函数相当于window对象的方式,即window.A = function() {…}; 因此该函数里this就是window
- 当把一个函数显示的赋值给一个对象的属性时,无论该函数是在哪定义的,都相当该变量拥有了该函数,例如boy.B,girl.C,girl.D
对象就是个词典
var obj = {};
obj.__class__ = 'Person';
obj.name = 'Aaron';
obj.method = function (xxx) {...};
function SomeClass(name) {
...
return obj;
}
对象不只是个词典
- 如果obj里定义了name,如obj.name = ‘xxx’,则返回它。
- 如果未定义,则查找obj.__proto__中有没有定义name。
- 如果未定义,则查找obj.__proto__.__proto__,以此类推,直到Object.__proto__(为空)
A = function() {...};
A.prototype = {};
A.prototype.__proto__ = Object.prototype;
A.prototype.constructor = A;
var a = {};
a.__proto__ = A.prototype;
a.constructor();//实际指向了A.prototype.constructor
- this.method = function() {…}
- A.prototype.method = function() {…}
B.prototype = new A(); B.prototype.constructor = B; //因为上一行把constructor更改了
function B() {
A.apply(this, arguments);
...
}
var TEMP = function(){};//需要用一个空对象过滤一下,不然会有问题
TEMP.prototype = A.prototype;
B.prototype = new TEMP();
B.prototype.constructor = B;

函数是与众不同的对象
- 一个函数在创建的时候,会把当前执行环境的Scope Chain传给Function的[[Construct]]方法,[[Construct]]创建一个内容与传入的Scope Chain完全一样的新的Scope Chain,,并赋给被创建函数的内部[[Scope]]属性。
- 在函数被调用时会创建一个新的Scope Chain,和函数的[[Scope]]内容一样,然后又创建一个[[Activation Object]],包含了该函数的所有参数(包括arguments)和局部变量的定义,并插入到Scope Chain的最前端。

