在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python  HTML/ 不是很理解object和構(gòu)造函數(shù)名的關(guān)系

不是很理解object和構(gòu)造函數(shù)名的關(guān)系

function Person(n, a, g){
    this.name = n;
    this.age = a;
    this.gender = g;
    this.speak = function (){   //這里只是說明this,實(shí)際應(yīng)該在prototype上定義對象方法
        console.log(this);
    };
}
//作為構(gòu)造函數(shù)使用
var o = new Person("Lily", 18, "F"); 
o.speak();  //Person {name: "Lily", age: 18, gender: "F"}
//作為普通函數(shù)使用
Person("Lily", 18, "F"); 
speak(); //Window

正在看一段this的說明,提到上面這段函數(shù)時(shí) 作者解釋“為什么11行得到的是Person...,而不是Object...。其實(shí)這里顯示的本來就應(yīng)該是構(gòu)造函數(shù)的名字,如果你通過varo=;創(chuàng)建的對象,相當(dāng)于o=newObject();,這時(shí)顯示的才是Object...” 這句話看不明白 Object和這個(gè)有什么區(qū)別呢 這樣解釋是什么意思

回答
編輯回答
奧特蛋

js本來沒有new,需要的人多了,也就有了new

首先我們來看一個(gè)函數(shù)

function Person(n, a, g) {
    var obj = {
        name: n,
        age: a,
        gender: g
    }
    obj.constructor = Person;   // 給個(gè)標(biāo)記表示這個(gè)obj由Person生成
    // 其他的屬性 obj.blabla....
    obj.speak = function () {
        console.log(this);
    }
    return obj;
}

var o = Person(n, a, g)

這個(gè)應(yīng)該挺好懂吧,新建一個(gè)對象然后返回,這個(gè)函數(shù)我們叫工廠函數(shù),就是每次都生成同一種對象然后返回。

后來人們想著,我每次這樣寫其實(shí)挺費(fèi)勁的,有沒有更好的辦法呢。

然后就有了

function Person(n, a, g) {
    this.name = n;
    this.age = a;
    this.gender = g;
    this.speak = function () {
        console.log(this);
    };
}

var o = new Person(n, a, g)

這個(gè)函數(shù)我們就叫構(gòu)造函數(shù),當(dāng)我們使用new Person()時(shí)它執(zhí)行的過程就跟上面的工廠函數(shù)基本是一樣的,不過這個(gè)函數(shù)自動(dòng)幫我們處理了很多事,方便很多。具體可以看new運(yùn)算符

那么不用new的時(shí)候呢?它就是一個(gè)普通函數(shù)。

那么我們回到上面的問題,Object和這個(gè)有什么區(qū)別

上面說了new的時(shí)候會(huì)先新建一個(gè)對象,然后我們的構(gòu)造函數(shù)會(huì)給新建的對象打上標(biāo)記constructor,用來表示這個(gè)對象是由哪個(gè)函數(shù)生成的,所以用new Person()出來的對象顯示的是Person,而new Object()出來的對象就是Object,雖然他們一開始都是對象Object

2017年7月2日 07:25
編輯回答
北城荒

你的疑惑只是不知道 new 關(guān)鍵字做了什么而已;
MDN官網(wǎng)有詳細(xì)的解釋,解釋的其實(shí)非常詳細(xì)了,個(gè)人就不獻(xiàn)丑了
new運(yùn)算符

2017年8月12日 21:05
編輯回答
故林
var o = new Person("Lily", 18, "F")

等價(jià)于

var o = new Object();//或{}或Object.create(Object.prototype);
o.__proto__ = Person.prototype;
Person.call(o,"Lily", 18, "F");
2018年2月3日 11:12