構造函數(shù)、原型鏈、原型對象、構造器的理解

(轉(zhuǎn)載)原文鏈接:https://blog.csdn.net/weixin_42618289/article/details/103925025

一、構造函數(shù)、實例化對象

function Person(name) {
    this.name = name;
}
var person1 = new Person('xiaoming');
var person2 = new Person('xiaoli');

function后面的方法名Person就是一個構造函數(shù),一般首字母大寫,需要new實例化;

new之后的對象就是實例化對象,此處的person1,person2就是實例化對象;

二、構造器constructor,原型prototype

每個對象都有一個constructor屬性,指向這個對象所在的構造函數(shù),如下:

person1.constructor == Person;
person2.constructor == Person;

Person.prototype是Person的原型"對象",所以這個對象也有constructor屬性,同樣指向Person,所以

Person.prototype.constructor == Person;

可得三者是等同關系,并且都等于Person:

person1.constructor == person2.construtor;
person1.constructor == Person.prototype.constructor;
person2.constructor == Person.prototype.constructor;

三、原型鏈proto

每個對象都有一個 proto 屬性指向創(chuàng)建它的構造函數(shù)的原型,如下:

person1.__proto__ == Person.prototype;
person2.__proto__ == Person.prototype;

Person本身是一個構造"函數(shù)",那么創(chuàng)建它的構造函數(shù)就是一個Function,所以

Person.__proto__ == Function.prototype;

Person.prototype 是一個原型"對象",那么創(chuàng)建它的構建函數(shù)就是一個Object,所以

Person.prototype.__proto__ == Object.prototype;

換個構造函數(shù)名字一樣的道理:

var example= new Object();
example.constructor == Object;
example.__proto__ == Object.prototype;
Object.__proto__ == Function.prototype;
Object.prototype.__proto__ == Object.prototype;
//當原型的__proto__屬性等于該原型的時候,就說明指向到了最頂層的對象null;所以可得:
Object.prototype.__proto__ null && == Object.prototype == null;

四、補充

1、Math和JSON是以對象存在的,所以

Math.__proto__ === Object.prototype;
JSON.__proto__ === Object.prototype;

2、Function.prototype是唯一一個typeof Function.prototype == "function"的原型,其他構造器的原型都是object

typeof Function.prototype == "function";

3、重寫會導致constructor指向發(fā)生改變

function Person() {
}
Person.prototype.name = "小明";
 
 
person1 = new Person();
person1.constructor.prototype.name = "小花";
console.log(Person.prototype.name, person1.constructor === Person);// 小花 true
 
person1 = {//這里已經(jīng)屬于重寫構造函數(shù)了
    getName: function(){
        console.log("獲取姓名");
    }
}
console.log(Person.prototype.name, person1.constructor === Person, person1.constructor === Object);// 小花 false true
 

END

image
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容