构造方法 就是这个对象名字的方法
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