原型和原型链
原型(空的实例对象)
- 每个函数都有一个prototype属性,它默认指向一个object空对象(即称为原型对象)
- 原型对象中有一个属性constructor,它指向函数对象
- 给原型对象添加属性(一般都是方法)
作用:函数的所有实例对象自动拥有原型中的属性(方法)
显示原型和隐私原型
- 每个函数function都有一个prototype,即显示原型{constructor:xxxx,proto}
- 每个实例对象都有一个_proto_,可称为隐式原型{constructor:xxxx,proto}
function Fun(){}
console.log(Fun.prototype)
var fun=new Fun();
console.log(fun.__proto__)
- 实例对象的隐式原型就是函数的显示原型
console.log(fun.__proto__===Fun.prototype)
原型链
- 隐式原型链:访问一个对象的属性时,先在自身属性中查找,找到返回,如果没有,再沿着__proto__这条链向上查找,找到返回,如果最终没有找到,返回undefined
函数原型实例关系图
- 函数既有显式原型又有隐式原型
- 所有函数都是Function的实例对象
- Function函数本身也是由Function创建的,Function隐式原型都一样
- 所有函数的隐式原型和Function构造函数的显式原型都是指向一个地方
- 函数的显示原型指向的对象默认是空Object实例对象(但Object不满足)
- Object的原型对象是原型链的尽头=null
- 对于一些通用方法,可以设置在属性里面
function Person(name, age) {
this.name = name
this.age = age
}
Person.setName = function (name) {
this.name = name
}
var p1 = new Person()
console.log("--------")
- 方法一般定义在原型上,属性一般通过构造函数定义在对象本身上
- 构造函数的实例对象自动拥有构造函数原型对象的属性(方法),这叫做原型继承
原型例子:
var A = function () {
}
A.prototype.n = 1;
var b = new A();
A.prototype.n = 2;
A.prototype.m = 3;
var c = new A();
console.log(b.n, b.m, c.n, c.m)
2 3 2 3
var A = function () {
}
A.prototype.n = 1;
var b = new A();
A.prototype = {
n: 2,
m: 3
}
var c = new A();
console.log(b.n, b.m, c.n, c.m)
1 undefined 2 3

浙公网安备 33010602011771号