js new关键字
要創建構造函數的實例,肯定要使用到new關鍵字,但是,到底需要哪些過程呢?
我們以下面為例,首先創建一個構造函數
function dog(){
? this.name='happy'
}
接下來我們分步驟來解析創建實例的過程:
1.首先,需要創建一個空對象 var obj={}
2.接下來我們需要把obj的__proto__屬性指向構造函數的prototype,? ?obj.__proto__=dog.prototype,
__proto__即原型屬性,是每一個對象都擁有的屬性,眾所周知,js中所有的類型皆為對象,這個屬性并非所有瀏覽器都有實現,而他的標準屬性為[[prototype]].
而prototype是函數才擁有的屬性,即原型對象。
3.接著,我們需要利用call方法,將dog函數內部的this指針替換為obj,并立即執行dog函數,由于指針被替換,所以dog函數內部的屬性會被復制到obj對象,這樣obj就會擁有dog所有的內部屬性, dog.call(obj)
4.最后,返回obj對象
?
把上面的步驟還原成方法
function _new(){
? ?var obj={}
? ?obj.__proto__=dog.prototype
? ?dog.call(obj)
? return obj
}
當然,在實例化時,有時候會傳入一些初始值,并且,我們也不會只對一個構造函數實例化,這個時候,我們只需對上面的方法進行一些改動
function _new(func) {
? ?var obj = {}
? ?obj.__proto__ = func.prototype
? ?const args=[].slice.call(arguments)
? ?args.splice(0,1)
? ?func.apply(obj, args)
? ?return?obj?
}
這樣的話,就可以滿足要求啦,定義一個cat函數
function cat(name,color){
? ?this.name=name
? ?this.color=color
}
var instance=_new(cat,'ali','yellow')
? ?console.log(instance.name) // ali
? ?console.log(instance.color) // yellow
? console.log( dogIns instanceof dog) // true
當然,在實際開發中,我們只需使用new關鍵就行了,上述代碼只是用來解釋實例化的過程。
?
轉載于:https://www.cnblogs.com/ly-lxy/p/10937344.html
總結
- 上一篇: package.json相关疑惑总结
- 下一篇: 九九乘法表--0702