大白话说明白对象、原型链、原型、构造方法

149 阅读2分钟
构造方法 就是这个对象名字的方法
function Phone(width,height,brand){
  //  构造过程
    this.width =width; //  成员属性
    this.height =height;
    this.brand =brand;  
    this.call =function(){ // 成员方法
        console.log("打电话咯")    
    }
}
原型对象的意义是 不用每次都在new 对象的时候开辟成员方法的内存空间了
所有实例都能访问原型对象的方法,地址是一样的
Phone.prototype.call = function(){
        console.log("打电话啦")
}
var xm = new Phone(100,100,'xm')
var hw = new Phone(120,120,'hw')
xm.call()
hw.call()
 原型对象: 它是一个对象。 js系统在创建这个类的时候就有的
  •  每个原型对象上都有一个 constructor 指向构造方法
  •  实例的 proto 就是 Phone.prototype 一模一样的 都是指向这个对象的原型对象
  • 原型上有 Phone.prototype.constructor 这个默认属性是指向的 构造方法Phone
  • 所以![实例].proto.constructor 也是指向的构造方法,实际上就是 访问了Phone.prototype的constructor。
  • 总归是一个原型对象 只不过实例可以通过关键字__proto__ 去访问罢了
  •  constructor 就是告诉这个对象的构造方法是什么
console.log(xm.__proto__.constructor)  
console.log(Phone.prototype.constructor) 一个玩意
xm.__proto === Phone.prototype // true

如果你把原型链用自己定义的对象覆盖了,那么constructor就丢了,需要自己手动指定一下

Phone.prototype = {
    constructor:Phone,
    call:function(){
        console.log("打电话啦")
    }
}

或者是继承的时候,如果你不想用子类的构造函数,都要用父类,同理也要手动指定

 原型链 
为什么会出现原型链?因为原型对象也是一个对象,只要是对象,就和上面说的一样,都有 proto
  •  一个实例访问方法的时候首先会看这个对象自身有没有这个方法,如果没有就向它的原型上寻找,比如这个call打电话的方法
  • 如果再没有就向这个原型对象的->原型对象 一直找到 Object
  • 最终Object原型对象的原型指向 proto 等于 null Object.prototype.proto == null

你懂了吗?