原型和实例对象
每一个函数天生都有一个原型(prototype),当函数被new关键字调用的时候,产生的实例的__proto__都指向次构造函数的prototype对象
function Person() {} console.log(Person.prototype);
function Person() {} var xiaoming = new Person(); console.log(xiaoming);
此时我们可以判断一下这个xiaoming的__proto__是否等于Person构造函数的prototype
console.log(xiaoming.__proto__ == Person.prototype)
构造函数的prototype指向了谁,该实例的__proto__就指向谁
__proto__有什么用?
所有的对象都有__proto__属性,这个属性指向的就是自己的“原型对象”,每一个对象在通过点语法访问自己的属性、方法的时候,都拥有原型链查找(proto search)的功能。什么叫做原型链查找?如果当前对
象自己身上有这个属性或者方法,则用自己的,如果没有则沿着__proto__指向的原型对象中去查找,如果在原型对象上有这个方法,则调用这个原型对象属性或者方法
function Person(name,sex) { this.name = name; this.sex = sex; } Person.prototype.sayHello = function () { console.log("你好,我是" + this.name + ",我是一个" + this.sex + "生,") }; var xiaoming = new Person("小明", "男"); var xiaohong = new Person("小红", "女"); console.log(xiaoming); console.log(xiaohong);
此时就可以看到方法是在原型对象上(也就是构造函数的原型上)
此时我们也可以验证xiaoming和xiaohong调用的是同一个函数
console.log(xiaoming.sayHello == xiaohong.sayHello)
语法:
function 构造函数(属性1,属性2,属性3) { this.属性1 = 属性1; this.属性2 = 属性2; this.属性3 = 属性3; } 构造函数.prototype.方法1 = function(){ } 构造函数.prototype.方法2 = function(){ } 构造函数.prototype.方法3 = function(){ }