(轉(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