课前小作业
var Student = function(sex){
this.sex = sex ;
}
Student.Persontotype.getSex= function(){
return this.sex;
}
var student1 = new Student('kim');
student1.getSex();
上面的两个this都是指向student1,我们确定this指向的时候,首先的第一准则是谁调用,指向谁。student1.getSex();
很显然是student1调用了该方法,所以这个this指向了student1。而student1 = new Student('kim');
是重新的new
了一个对象的实例,我们知道,new
的过程就是新开辟一块内存区域,然后将this指向新new
出来的对象。、
原型模式
从字面的理解一下prototype,就是通过调用构造函数来创建这个对象实例的原型对象。
使用原型对象的好处就是可以让所有对象实例共享它所包含的属性和方法;不必再构造函数中定义对象的实例信息,而是将这些实例的信息直接添加到原型对象中。
原型对象
只要创建一个新的函数,就会根据一个特定的规则为函数创建一个prototype属性,这个属性是一个对象,指向函数的原型对象,在默认的情况下面,每一个原型对象都会自动获得一个constructor属性,这个属性是一个指向prototype属性所在函数的指针。也就是前一节提到了Student.prototype.constructor == Student
,由一个图片进行具体的说明:
可以得出的结论:
Student.prototype.constructor == Student
student1.__proto__ == Student.prototype
student1.constructor == Student
注意:从本质上面进行观察真正的连接存在于实例(student1
)和构造函数(Student
)的原型之间(prototype
),而不是存在于实例(student1
)和构造函数之间(Student
)
ps:经常提到的hasOwnPrototype()方法可以用来检测一个属性是存在于实例中(true
),还是存在于原型中(false
)。for..in..循环,会将原型和实例中的属性都进行遍历一遍。
小结:
student1.__proto__ === Student.prototype;
Student.__proto__ === Function.prototype;
Student.prototype.__proto__ == Object.prorotype;//Student.prototype在本质上看就是一个简单的函数
Object.prototype__proto__ =null;//原型链的订单是null
本文部分参照了最详尽的 JS 原型与原型链终极详解,没有「可能是」。(二)和《JavaScript 高级程序设计》