1. 程式人生 > >用關鍵字new建立物件 new都做了什麼(隨筆)

用關鍵字new建立物件 new都做了什麼(隨筆)

function Person () {
    this.name = name;
    this.age = age;
    this.job = job;

    this.sayName = function () {
        return this.name;
    };
}

var person = new Person("tom", 21, "WEB");

console.log(person.name);

使用關鍵字new建立新例項物件經過了以下幾步:

1、建立一個新物件,如:var person = {};

2、新物件的_proto_屬性指向建構函式的原型物件。

3、將建構函式的作用域賦值給新物件。(也所以this物件指向新物件)

4、執行建構函式內部的程式碼,將屬性新增給person中的this物件。

5、返回新物件person。

var person = {};

person._proto_ = Person.prototype; //引用建構函式的原型物件

Person.call(person); //將建構函式的作用域給person,即:this值指向person

當採用構造器呼叫模式時,即使用new關鍵字去呼叫一個函式時,函式執行的方式會被修改。如果new是一個方法而不是一個運算子時,它可能會這樣執行:

Function.methos("new", function () {
    //新建立一個物件,它繼承了構造器的原型物件。
    var that = Object.create(this.prototype); //此時,this是指向Function構造器的。
    //呼叫構造器,繫結this物件到新物件that上
    var other = this.apply(that, argument); //此時,this物件指向that物件。
    //如果它的返回值不是一個物件,就返回新的物件。
    return (typeof other === "object" && other) || that;
});

以上程式碼,也可以說明在呼叫new關鍵字時,發生了什麼事,或者說是呼叫new關鍵字建立的新物件經歷了哪些步驟後擁有了函式的特性。


注意:

通過new關鍵字建立某建構函式的新例項物件,就是將原型鏈與例項的this聯絡起來,this指向這個新物件,同時也指向這個建構函式,並且this物件還是這個建構函式的例項。如果沒有使用new操作符,直接用建構函式建立新例項物件,那麼this物件就指向了window物件,不會指向這個新物件的,不管給這個新物件新增什麼屬性,都沒有用,是直接新增到了window物件上了。