javascript 對象、屬性、原型、原型鏈、new、constructor

對象

在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

new

function person(){
}
var p=new person();
alert(p.__proto__===person.prototype);//true

new的做用:spa

  1. var p={};//聲明個空對象prototype

  2. p.__proto__=person.prototype;//把P__proto__的屬性指向person的原型設計

  3. person.call(p);//把this的指針指向p指針

constructor

概念: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)

clipboard.png

這個栗子沒毛病他指向了構造函數。
而後看栗子2:

//定義構造函數
function person(name){
    this.name=name;
}
//給他原型上添加個方法
person.prototype={
    say:function(){
    console.log(this.name)
    }

}
//測試下
var p=new person("xx");
alert(p.constructor)

clipboard.png
看吧很不靠譜除非你在去手動的改它的值

hasOwnProperty

來源:它就是經過原型鏈從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
相關文章
相關標籤/搜索