1. 程式人生 > 其它 >js高階-建立一個物件的過程

js高階-建立一個物件的過程

建立物件方法有兩種,物件字面量/建構函式

(1)物件字面量

它適合少量簡單的物件建立

var obj = {
    a:10,
    b:'符',
    say(){
        //函式體
    }
}
//但是如果我們需要建立大量具有相同型別屬性和方法(但值不同)的物件時,物件字面量就不適合了
//而且它也沒有繼承這類高階特性
//比如你需要建立統計公司1w名員工資訊,總不可能一個一個去寫物件字面量吧

物件字面量在建立大量同類型物件上的不足,建構函式解決了這個問題

(2)建構函式

建構函式通過new操作符呼叫建構函式,建立對應型別物件

建構函式的定義

function Fn(){
    this
.p = "建立了一個p屬性"; this.alterP = function(){ console.log(this.p); //注意一定要this,執行呼叫它的物件,才能用作用域鏈找到p } } var o1 = new Fn();

在new呼叫建構函式時,發生的過程實際上為

// 創造一個空物件字面量
var obj = {};
// 給空物件新增__proto__屬性,並將建構函式的原型物件引用地址賦值給它
obj.__proto__ = Fn.prototype;
// 將建構函式的作用域賦值個新物件,Fn函式中的this在call()函式操作下指向新物件obj,然後再呼叫Fn函式
於是給obj物件賦值了一個成員變數p和成員方法alterP Fn.call(obj); //最後將這個obj物件作為new操作Fn返回的結果賦值給a變數 return obj; var a = obj

(3)constructor屬性

修改物件原型上的constructor屬性指向另一個建構函式,再呼叫原建構函式也不會發生變化,,起初始化物件作用的只能是建構函式本身

function C3(a, b){  
    this.p = a + b;  
    this.alertP = function(){  
        alert(this.p);  
    }  
}  
//我們定義一個函式來覆蓋C3原型中的constructor,試圖改變屬性p的值 function fake(){ this.p = 100; } C3.prototype.constructor = fake; //覆蓋C3原型中的constructor var c3 = new C3(2,3); c3.alertP();//結果仍然為5