JS建立物件幾種不同方法詳解

2021-08-21 04:31:16 字數 2190 閱讀 1559

每個方法都有在每個例項上重新建立一遍。person1和person2都有乙個sayname()的方法,但兩個方法不是同乙個function例項。不同例項上的同名函式是不相等的。 

建立兩個完成同樣任務的function例項沒有必要,而且還有this物件在,不需要在執行**前就把函式繫結在特定物件上,可以像下面這樣。 

把sayname屬性設定成全域性的sayname函式,這樣,由於sayname包含的是乙個指向函式的指標,因此person1和person2物件就共享了同乙個函式。 

但是,如果物件需要定義很多方法,那麼就要定義很多全域性函式,自定義的引用型別也沒有封裝可言了。為了解決上述問題,引入原型模式。

console.log(person.prototype.isprototypeof(person1)); //true 

object.getprototypeof()返回的是[[prototype]]的值

console.log(object.getprototypeof(person1)); 

//person 返回的是person的原型物件。 

console.log(object.getprototypeof(person1) === person.prototype)//true 

console.log(object.getprototypeof(person1).name);//」yvette」 

hasownproperty()方法可以檢測乙個屬性是存在於例項中,還是存在於原型中,只有給定屬性存在於例項中,才會返回true。

console.log(person1.hasownproperty(「name」));//false 

原型與in操作符

有兩種方式使用in操作符:單獨使用和在for-in迴圈中使用。單獨使用時,in操作符會在通過物件能夠訪問給定屬性時返回true,無論該屬性在於例項中還是原型中。 

使用for in迴圈,返回的是所有能夠通過物件訪問的、可列舉的屬性,其中既包括例項中的屬性,也包括存在於原型中的屬性。如果例項中的屬性遮蔽了原型中不可列舉的屬性,那麼也會返回。ie9之前的版本實現上有乙個bug,遮蔽不可列舉屬性的例項屬性不會在for-in中返回。 

在ie9之前的吧按本中沒有log資訊。儘管person例項中的tostring()方法遮蔽了原型中的不可 列舉的tostring(); 

原型簡寫

這導致了person1.constructor不再指向person,而是指向了object。如果constructor很重要,則需要特意將其設為適當的值,如: 

但是這種方式會導致constructor屬性變成可列舉。 

如果想設定為不可列舉的(預設不可列舉),可以使用object.defineproperty(person.prototype, 「constructor」, ); 

原型的動態性

由於在原型中查詢值的過程是一次搜尋,因此我們對原型物件所做的任何修改都能夠立即從例項上反映出來。 

如果重寫整個原型物件,情況就不一樣了。呼叫建構函式時會為例項新增乙個指向最初原型的[[prototype]]指標,而把原型修改為另外乙個物件就等於切斷了建構函式與最初原型之間的聯絡。例項中的指標僅指向原型,而不指向建構函式。 

person.prototype指向的是原本的原型物件,而不會指向新的原型物件。 

原型物件的問題

原型模式最大問題是由其共享的本性所導致的。 

對於包含引用型別值的屬性來說,問題較為突出 

本意只想修改person1的friends,但是卻導致person2的friends屬性值也改變了。因此我們很少單獨使用原型模式。

js動態建立li的不同方法

一 document.body.innerhtml 我們可以 用document.body.innerhtml 方法向body內新增li元素,但迴圈新增太耗效能,可以先迴圈將要新增的字串預先連線後儲存到str裡,再一次性新增給body document.body.innerhtml str,這樣可以...

JS幾種建立物件的方法

1.工廠模式 function person name,age,job return o var person person zhangsan 23 web 2.建構函式模式 function person name,age,job var person1 new person dy 23,web ...

JS中不同方法如何實現繼承

首先來乙個父類的建構函式 父類 function person name,age,person.prototype.personlogage function let person1 newperson xiao 20 male console.log person1 person注意 物件a的 p...