用關鍵字new建立物件 new都做了什麼(隨筆)
阿新 • • 發佈:2018-12-23
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物件上了。