javascript
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屬性。
問題:不同實例之間的同名函數不相等(具有不同的作用域鏈和標識符解析)
解決:將函數的定義移到構造函數外部。
問題:sayHello定義在全局作用域,但實際上只能被某個對象調用。名不副實。2. 在需要定義很多方法的情況下,需要定義很多全局函數,違背封裝的理念。
解決:原型模式
原型模式
每一個函數都有一個原型屬性,這個原型是一個指針,指向一個對象。
這個對象包含同一構造函數所創建的所有實例所共享的屬性和方法。
事實上,上文提到的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):对象创建模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Logstash之Logstash in
- 下一篇: php 浮点型float 强转int