模拟创建对象:
用new操作符创建对象的时候javascript会做3件事:
首先是创建一个空对象(empty object),
然后对这个空对象的原型对象进行赋值,
最后把这个空对象赋值给构造函数的this属性且运行这个构造函数。
function Person(name) {
this.name = name;
}
var p = new Person(); 相当于以下步骤:
1. var p = {};
2. p.[[prototype]] = Person.prototype //这一步是伪代码,实际上一个对象的原型对象是不能通
过代码来访问的,
3. p.methodName = Person ; //这样的话Person的this就会指向p
p.methodName();
创建完一个空对象后,会初始化这个空对象的原型对象,javascript会把构造函数的一个叫做
prototype的属性所指向的对象赋值给当前空对象的原型对象。所有的function都有一个prototype属
性,当一个function被定义之后这个属性会被自动的创建和初始化。一个function 的prototype属性的
初始值是一个对象(an object),这个对象只有一个属性叫做constructor,而这个constructor 的值
就是当前这个函数(或者叫构造函数)。
function Person(name) {
this.name = name;
}
Person === Person.prototype.constructor; //true
总结:
1. 所有的对象都有原型对象,但不是每个对象都有prototype属性。
2. prototype属性是函数(function)特有的属性。
3.函数(function)也是一个对象,那么它也有原型对象,它的原型对象和它的prototype属性没有任
何关系。
4.一个函数的原型对象是Function.prototype所指向的那个对象。因为所有的function都是Function的
实例,Function是所有funciton的构造函数,按照上面的定义,一个对象的原型对象是这个对象的构造
函数的prototype所指的那个对象。
function Person(name) {
this.name = name;
}
var p = new Person(“Marry”);
p 的原型对象是Person.prototype
Person 的原型对象是Function.prototype
Person.prototype.constructor === Person //true
继承的例子:
function Person(name){
this.name = name;
}
Person.prototype.walk = function () {
alert(“walking”);
}
function Author(){
}
现在有了Author,想要用Author创建出来的对象继承Person那么就把Author的prototype属性重新赋值
为一个Person对象
Author.prototype = new Person();
然后赋值之后原来的Author.prototype.constructor 就不是原来的Author 所以还要
Author.prototype.construtor = Author