在javascript中常常聽到一句話叫作一切事物皆對象。
其實得除null和undefined除外 數字也有點特殊看栗子javascript
false.toString();//'false' [1,2,3].toString();//'1,2,3' //數字 (1).toString();//'1' 1 .toString();// '1' 1..toString();// '1' 1.toString();//Unexpected token ILLEGAL //null undefined null.toString();//Cannot call method 'toString' of null undefined.toString();//Cannot call method 'toString' of undefined
數字應該是js引擎解析出錯
這裏特別注意的是對象也分爲普通對象和函數對象,函數對象就是經過new Function建立的對象普通對象就是Object後面講到原型時會用到。java
var text1={}; var text2={name:'xx',age:'3'} //屬性的訪問 text2.name//xx text2[name]//undefined text2['name']//xx
對象屬性的刪除只有delete,去設置它的值爲null、和undefined 只是制空 方便gc回收屬性仍然存在。編程
var text={name:'xx',age:'3',say:'hello'} text.name=null; text.age=undefined; delete text.say; text;//{name:null,age:undefined}
概念:每當定義個個對象的時候,對象中會包含一些預約義的屬性。其中函數對象的一個屬性就叫原型對象prototype。
普通對象是沒有prototyoe的,但有__proto__屬性。
做用:原型對象就是用來作繼承用的。
栗子:函數
var person=function(name){ this.name=name; } person.prototype.getName=function(){ return this.name; } var xx=new person('我叫xx'); xx.getName();//經過原型的屬性繼承了getName方法
至於怎麼實現的就得說到原型鏈了。測試
概念:JS在建立對象的時候無論是普通對象仍是原型對象都有一個叫作__proto__的屬性,他用於指向那個建立它的對象的原型prototype。然而建立他的對象也有_proto_這個屬性,一樣又指向上一層,直到 __proto__這個屬性爲null爲止,這樣造成的一條鏈狀就叫原型鏈 。this
function person(){ } var p=new person(); alert(p.__proto__===person.prototype);//true
new的做用:spa
var p={};//聲明個空對象prototype
p.__proto__=person.prototype;//把P__proto__的屬性指向person的原型設計
person.call(p);//把this的指針指向p指針
概念:constructor這個屬性不會影響內部的任何屬性。
只是JavaScript語言設計的歷史遺留物。因爲constructor屬性是能夠變動的,因此未必真的指向對象的構造函數,只是一個提示。不過,從編程習慣上,咱們應該儘可能讓對象的constructor指向其構造函數,以維持這個慣例。
總結下:說白了一個並沒什麼太大用的東西!y很不靠譜!很費操做!
理由看栗子1:
//定義構造函數 function person(name){ this.name=name; } //給他原型上添加個方法 person.prototype.say=function(){ console.log(this.name); } //測試下 var p=new person("xx"); alert(p.constructor)
這個栗子沒毛病他指向了構造函數。
而後看栗子2:
//定義構造函數 function person(name){ this.name=name; } //給他原型上添加個方法 person.prototype={ say:function(){ console.log(this.name) } } //測試下 var p=new person("xx"); alert(p.constructor)
看吧很不靠譜除非你在去手動的改它的值
來源:它就是經過原型鏈從Object.prototype那繼承過來的。
做用:用來判斷一個對象是否包含自定義屬性而不是原型鏈上的屬性
上栗子:
Object.prototype.one=1;//先定義一個原型屬性one var text={two:2,three:3};//那麼全部的普通對象都繼承one console.log(text.one);//1 'one' in text;//true 他去找原型鏈上的屬性去了 text.hasOwnProperty('one');//false text.hasOwnProperty('two');//true text.hasOwnProperty('three');//true