對(duì)于面向?qū)ο笞约浩鋵?shí)一直都挺糊涂的,就整理了一下面向?qū)ο笾腥菀赘愫康膸c(diǎn) 搞完以后覺(jué)得清晰多了
原型對(duì)象使用的注意點(diǎn)
1.如何訪問(wèn)原型上面的屬性
- a.對(duì)象.屬性
- b.構(gòu)造函數(shù).prototype.屬性
2.屬性的訪問(wèn)原則
- 就近原則,在訪問(wèn)屬性的時(shí)候,先在對(duì)象自身查找(實(shí)例屬性/方法),如果找到那么就直接使用.如果沒(méi)有找到就去它們的原型對(duì)象身上去找,如果找到就直接使用,如果沒(méi)有找到就undefined或者報(bào)錯(cuò)
3.設(shè)置原型屬性
- 1.左值:如果是左值,那么在設(shè)置對(duì)象的屬性的時(shí)候,不會(huì)去原型對(duì)象上面去找,查到自己是否有,如果有就修改,如果沒(méi)有就添加.
- 2,如果是右值,那么在取值的時(shí)候就先找自己,找不到就去原型身上找.
- 左值就是賦值 右值就是取值
- 列如:p1.hello="hi ;左值
- console.log(p1.hello); 右值
- 3.設(shè)置原型屬性的方法
- a.只能通過(guò)構(gòu)造函數(shù).prototype.屬性或者直接替換原型對(duì)象的方式來(lái)設(shè)置
- b.如果原型對(duì)象的屬性是引用類型的,那么通過(guò)對(duì)象的方式來(lái)進(jìn)行設(shè)置
重點(diǎn)來(lái)了!!!!!!!
function Person(){};
Person.prototype.name='張三';
Person.prototype.showName=function(){
console.log(this.name);
};
var p1=new Person();
var p2=new Person();
p1.showName();//張三
console.log(p1.name);//張三
p1.name='李四'; //設(shè)置的是對(duì)象的實(shí)例屬性,不能修改原型屬性
console.log(p1.name);//李四
console.log(p2.name);//張三
console.log(p1); //實(shí)例屬性是李四,原型屬性還是張三,不能修改原型屬性
console.log(p2); //給p1設(shè)置實(shí)例屬性對(duì)p2沒(méi)任何影響
結(jié)果看每行代碼后面的注釋
上面代碼結(jié)構(gòu)很簡(jiǎn)單 就是根據(jù)屬性的訪問(wèn)規(guī)則:就近原則
p1.name先在實(shí)例屬性上找name,沒(méi)有,原型屬性上有 拿過(guò)來(lái)用所以一開(kāi)始是張三
當(dāng)p1.name=李四;設(shè)置了實(shí)例屬性,再找name發(fā)現(xiàn)實(shí)例屬性上有,有就拿來(lái)用,就不用去原型上找了所以就是李四
但是p2沒(méi)有設(shè)置實(shí)例屬性,所以p2.name還是原型上的name張三
如果原型對(duì)象的屬性是引用類型的
function Person(){};
Person.prototype.name='張三';
Person.prototype.car={type:"火車",color:"red"};
var p1=new Person();
var p2=new Person();
/*如果原型對(duì)象的屬性是引用類型的*/
console.log(p1.car.type);//火車
p1.car.type='飛船';
console.log(p1.car.type);//飛船
console.log(p2.car.type);//飛船
對(duì)于 p1.car.type='飛船';代碼讀取方式是先讀取p1.car 取值嘛就是右值,上面說(shuō)過(guò)右值在自身上找 找到了再設(shè)置,沒(méi)有就往原型上找,找到了發(fā)現(xiàn)有個(gè)car 然后修改car中type中的值改為飛船
console.log(p1.car.type);//飛船 先讀p1.car.自己沒(méi)有,原型上找有 拿來(lái)用一找 找到了飛船
console.log(p2.car.type);//飛船 同理
看看另一種情況
function Person(){};
Person.prototype.name='張三';
Person.prototype.car={type:"火車",color:"red"};
var p1=new Person();
var p2=new Person();
// /*如果原型對(duì)象的屬性是引用類型的*/
console.log(p1.car.type);//火車
p1.car.type='飛船';
console.log(p1.car.type);//飛船
console.log(p2.car.type);//飛船
p1.car={type:"火箭"};
console.log(p1.car.type);//火箭
console.log(p2.car.type);//飛船
p1.car={type:"火箭"}; 左值 自身沒(méi)有添加并賦值 在自身身上添加和賦值
console.log(p1.car.type);//火箭 先讀p1.car發(fā)現(xiàn)自己有 直接用 所以是火箭
console.log(p2.car.type);//飛船 先讀p1.car 發(fā)現(xiàn)沒(méi)有 就往原型上找找到了拿來(lái)用
通過(guò)這幾個(gè)例子應(yīng)該明白了吧,最主要是運(yùn)用左值和右值那么怎么變?cè)趺锤亩紱](méi)問(wèn)題了