- 創(chuàng)建對(duì)象有幾種方法
- 原型,構(gòu)造函數(shù),實(shí)例崔列,原型鏈
- instanceof的原理
- new運(yùn)算符
創(chuàng)建對(duì)象有幾種方法
//第一種方式:字面量
var o1={name:'o1'};
var o2=new Object({name:'o2'});
//第二種方式:通過構(gòu)造函數(shù)
var M=function(name){this.name=name};
var o3=new M('o3');
//第三種方式:Object.create
var p={name:'p'};
var o4=Object.create(p);//答出來加分!旺遮!
為什么o4對(duì)象沒有顯示name赵讯,因?yàn)閛4本身是一個(gè)空對(duì)象,通過Object.create()把o4的proto指向傳入對(duì)象耿眉,也就是說傳入的對(duì)象為o4的原型边翼。所以o4本身是沒有name屬性的,通過原型鏈查找到p才會(huì)有name屬性鸣剪。
原型组底,構(gòu)造函數(shù),實(shí)例筐骇,原型鏈
instanceof的原理
原理:判斷實(shí)例對(duì)象的protp與構(gòu)造函數(shù)的prototype引用的是不是同一個(gè)地址债鸡。
只要是在一條原型鏈上的都會(huì)返回true。
怎么區(qū)分是哪個(gè)對(duì)象的實(shí)例
用constructor比用instanceof要嚴(yán)謹(jǐn)一些拥褂。
new運(yùn)算符
<script type="text/javascript">
//第一種方式:字面量
var o1={name:'o1'};
var o2=new Object({name:'o2'});
//第二種方式:通過構(gòu)造函數(shù)
var M=function(name){this.name=name};
var o3=new M('o3');
//第三種方式:Object.create
var p={name:'p'};
var o4=Object.create(p);
//new的本質(zhì)
var new2=function(func)
{
var o=Object.create(func.prototype);
var k=func.call(o);
if(typeof k==='object')
{
return k;
}else{
return o;
}
}
</script>
注意:若構(gòu)造函數(shù)中沒有返回值或返回值是基本類型(Number娘锁、String牙寞、Boolean)的值饺鹃,則返回新實(shí)例對(duì)象;若返回值是引用類型的值间雀,則實(shí)際返回值為這個(gè)引用類型悔详。