构造函数、原型、和实例的关系:
每个构造函数都有一个原型对象,原型对象都包含一个指向构造函数的指针,而实例都包含一个指向原型对象的内部指针。
搜索顺序首先从对象实例本身实例开始。如果在实例中找到了具有给定名字的属性,则返回该属性的值。
如果没有找到,则继续搜索指针指向的原型对象,在原型对象中查找具有给定名字的属性,如果原型对象中中找到了这个属性,则返回该属性。
但是我们发现一个问题,就是实例中的指针仅指向原型,而不指向构造函数,这里的"仅指向原型对象",为什么搜索顺序又是从对象实例开始,然后搜索原型对象呢?
function Person(){ }
Person.prototype.name="xiu";
Person.prototype.sayName=function(){
alert(this.name);
};
var friend = new Person();//创建一个实例对象
friend.name="xie"; //为friend实例对象添加name属性
friend.sayName=function(){//为friend实例对象添加sayName方法
alert(this.name);
}
friend.sayName();// xie 会覆盖原型对象的name属性和sayName方法,搜索到的是对象实例中的方法
// 这就解释了为什么先从对象开始搜索
--------------------------------------------------------------------------------------------------------------------
function Person(){
var name=22;
function sayName(){
alert(this.name+10);
}
} //构造函数中有name属性和sayName方法
Person.prototype.name=25;
Person.prototype.sayName=function(){
alert(this.name);
};
var friend = new Person();//创建一个实例对象
friend.sayName(); //25 搜索到的是原型对象的sayName方法,而不是指向构造函数中的sayName方法。
//实例中的属性值和构造函数初始化的值没有什么关系,除非是用this指向,才能将构造函数初始化的值传递给实例。
--------------------------------------------------------------------------------------------------------------------
function Person(){
this.name=22;
this.sayName = function sayName(){
alert(this.name+10);
}
}
Person.prototype.name=25;
Person.prototype.sayName=function(){
alert(this.name+5);
};
var friend = new Person();//创建一个实例对象
friend.sayName(); // 32 实例属性和方法都在构造函数中定义(都加了this的,创建实例时就把这些属性给了实例对象)
--------------------------------------------------------------------------------------------------------------------
var name=7;
function Person(){
this.name=22;
this.sayName = function sayName(){
alert(name+10);
}
}
Person.prototype.name=25;
Person.prototype.sayName=function(){
alert(this.name+5);
};
var friend = new Person();//创建一个实例对象
friend.sayName(); // 710 实例属性和方法都在构造函数中定义(都加了this的,创建实例时就把这些属性给了实例对象),在没有this的情况下,找到的是全局作用域中的name属性。
//同样,为什么变成string类型的,我也不知道为什么?
经过测试:不管在实例还是在原型对象中,在sayName()方法里,name前如果没有this,全都指向全局作用域中的name属性
如果name前有this,则先找的是实例中的name值,如果没有,那么再找原型对象中的name值,如下面所示。
------------------------------------------------------------------------------------------------------------------------------------------
function Person(){
this.name=22;
function sayName(){
alert(this.name+10);
}
}
Person.prototype.name=25;
Person.prototype.sayName=function(){
alert(this.name+5);
};
var friend = new Person();//创建一个实例对象
friend.sayName(); // 27 实例属性定义在构造函数中,方法没有给实例(没有加this),最后在原型中查找sayName方法,name属性就是存在实例中的那个。
-------------------------------------------------------------------------------------------------------------------
function Person(){}
Person.prototype.name="xiu";
Person.prototype.sayName=function(){
alert(this.name);
};
var friend = new Person();//创建一个实例对象
friend.sayName();//搜索的是原型对象的方法