日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JavaScript中的面向对象(1):对象创建模式

發布時間:2024/4/15 javascript 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript中的面向对象(1):对象创建模式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

對象

JS中的對象是無序屬性的集合,屬性可以包括基本值、對象、函數。簡而言之,JS中的對象就是一組鍵值對。

創建對象

工廠模式

工廠模式是用函數將創建對象的細節封裝起來。

function createPerson(name){var o = new Object(); o.name = name; return o;}

特點:顯式地創建對象,有return
問題:無法解決對象識別的問題

構造函數模式

類似Object、Array等原生構造函數,我們可以自定義構造函數。

function Person(name){ this.name = name; this.sayHello = function(){ alert('hello' + this.name)} }var person1 = new Person("Peter"); var person2 = new Person("Mike");

特點:不顯式地創建對象,沒有return,構造函數的首字母大寫,不同實例之間具有相同的constructor屬性。
問題:不同實例之間的同名函數不相等(具有不同的作用域鏈和標識符解析)
解決:將函數的定義移到構造函數外部。

function Person(name){ this.name = name; this.sayHello = sayHelo; }function sayHello(){ alert('hello' + this.name)} }

問題:sayHello定義在全局作用域,但實際上只能被某個對象調用。名不副實。2. 在需要定義很多方法的情況下,需要定義很多全局函數,違背封裝的理念。
解決:原型模式

原型模式

每一個函數都有一個原型屬性,這個原型是一個指針,指向一個對象。
這個對象包含同一構造函數所創建的所有實例所共享的屬性和方法。

function Person(){ }Person.prototype.name = 'Mike'; Person.prototype.sayHello = function(){ alert('hello'+this.name); }

事實上,上文提到的constrcutor屬性,也存在于原型對象中。
訪問對象屬性時,首先查找實例本身,然后查找原型對象。如果實例本身具有該屬性,就會屏蔽原型對象中的同名屬性。

用對象字面量來重寫

function Person(){ }Person.prototype = { name:'Mike'; sayHello = function(){ alert('hello'+this.name); }

此時

var mike = new Person mike.constructor == Person //false mike.constructor == Object //false

更正:

Person.prototype = { constructor:Person name:'Mike'; sayHello = function(){ alert('hello'+this.name); }

進一步更正:

Object.defineProperty(Person.prototype,"constructor",{ enumerable: false, value:Person })

構造函數與原型模式組合

function Person(name){ this.name = name; this.friends = ['a','b']}Person.prototype = { constructor:Person; sayHello: function(){ alert('hello'+this.name) } }

優點:每個實例擁有自己的屬性,不會互相干擾。

動態原型模式

function Person(name){ this.name = name; this.friends = ['a','b']}if(typeof sayHello != function){ // 只需判斷一個 Person.prototyp.sayHello = function(){ alert('hello'+this.name) } Person.prototyp.sayBye = function(){ alert('Bye'+this.name) } }

優點:將所有信息封裝在構造函數中,而只在第一次初始化時,添加原型方法。

寄生構造函數模式

在不改變某對象原型的情況下,添加新的方法。

function SpecialArray(){var values = new Array();values.toPipedString = function(){ return this.join('|'); }return values;}

缺點:對象與構造函數之間沒有關系,不能使用instanof操作符。

穩妥構造函數模式

function Person(name){ var o = new Object(); o.sayName = function(){ alert(name) } return o; }var mike = Person('mike');

特點:不使用new操作符,實例方法中不引入this。
缺點:對象與構造函數之間沒有關系,不能使用instanof操作符。

轉載于:https://www.cnblogs.com/cogons/p/6628985.html

總結

以上是生活随笔為你收集整理的JavaScript中的面向对象(1):对象创建模式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。