Node.js new 、 prototype 與 __proto__

一、構造一個Person對象(相當於Java中的有參構造函數)

function person(name, sex, age, addr, salary) {
    this.name = name;
    this.sex = sex;
    this.age = age;
    this.addr = addr;
    this.salary = salary;
}

二、對象實例隱式傳遞this指針

person.prototype.func_pro=function () {
    console.log(this);
};
let Sakura =new person("Sakura","女",16,"FateStayNight",10000000000);
let Illyasviel= new person("Illyasviel ","女",14,"FateStayNight",9999999999);
Sakura.func_pro();
Illyasviel.func_pro();
console.log("-------------------------------------------------------" + "\n\n");

三、new 與 prototype

1、總結:

console.log("new 與 prototype");
//1、let variable ={};
//2、nodejs中每個對象都有一個__proto__屬性
//   建立兩個對象之間的關聯:
//   一個對象可以使用__proto__關聯另外一個對象
//    __proto__(對象的內部原型的引用): prototype(對象的原型) 淺拷貝
//    __proto__與prototype指向同一個對象的引用
//3、 對象實例作爲this指針的指向 傳遞給後面的函數
//4、 調用這個函數

2、可以通過prototype.key=value 來擴充對象Elf

function Elf(name) {
    this.name =name;
    console.log("Elf\t"+name);
}
console.log("可以通過prototype.key=value 來擴充對象Elf");
Elf.prototype.love=function () {
    console.log("%s love 'DATE A LIVE!'", this.name);
};

let Yuzuru = new Elf("Yuzuru");
let Kaguya = new Elf("Kaguya");

Yuzuru.love();
Kaguya.love();

console.log("-------------------------------------------------------" + "\n\n");

3、 實例.__proto__ 與 方法.prototype指向 同一個對象的引用

console.log("實例.__proto__ 與 方法.prototype指向 同一個對象的引用");
console.log(Yuzuru.__proto__);
console.log(Elf.prototype);

console.log("-------------------------------------------------------" + "\n\n");

let func_data =function(){
    console.log("func_data");
};

func_data.prototype.func_test=function(){
    console.log("func_test",this);
};// 實例.__proto__ 與 方法.prototype指向 同一個對象的引用
console.log("實例.__proto__ 與 方法.prototype指向 同一個對象的引用");
console.log(Yuzuru.__proto__);
console.log(Elf.prototype);

console.log("-------------------------------------------------------" + "\n\n");

let func_data =function(){
    console.log("func_data");
};

func_data.prototype.func_test=function(){
    console.log("func_test",this);
};

4、實例.__proto__ 與 方法.prototype 分別屬於2個不同的字典表{}

console.log("實例.__proto__ 與 方法.prototype指向 分別屬於2個不同的字典表{}");
let data =new func_data();
data.name="Innocence";
data.__proto__.func_test();
data.func_test();

console.log("-------------------------------------------------------" + "\n\n");

5、可以將對象實例看做爲一張字典表

//可以將data看做1張表
console.log("可以將data看做1張表");
//隱式調用this
data.func_test();
//顯示調用this 將data作爲this傳遞給data._proto_對象裏的函數test_func
data.__proto__.func_test.call(data);

console.log("-------------------------------------------------------" + "\n\n");

6、調用取值的順序

data.func_test=function () {
    console.log("new func_test",this);
};

data.func_test();
//data.key_func 首先會到對象實例的表裏搜索是否有沒有這樣的key  若沒有再到其__proto__裏面搜索
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章