- 构造函数+原型链
一般情况下,属性在对象本身上,方法在原型中
- prototype(显示原型)
- 每个函数都有一个prototype,为一个空对象{},称为原型对象({}无自己 写的属性).
- 原型对象中有constructor,__proto__两个属性
- 原型对象中的__proto__存的地址值等于Object.prototype存的地址值,地址值指向同一个对象所以相等
- 原型对象中的__proto__默认指向Object的实例对象Object.prototyp(Object构造函数除外,因为它的原型对象直接就是Object.prototyp)
- 原理
function Fun(){} 函数
内部代码 : Fun.prototype = {}- 原型对象中的constructor,指向该函数对象
Fun.prototype.constructor = Fun
- proto(隐式原型)
- 每个函数都有一个__proto__,都是Function.prototype
- 每个实例对象都有一个__proto__
- 原理
var fun = new Fun()
fun.proto = Fun.prototype
内部代码 : fun.proto = Fun.prototype
- 规则
- 实例对象隐式原型等于构造函数显示原型
fun.proto === Fun.prototype
//fun是实例对象,不是函数,没有 prototype
Fun.proto === Function.prototype
Function.proto === Function.prototype
Object.proto === Function.prototype- 给原型对象添加属性,函数的所有实例对象自动拥有原型对象中的属 性
Fun.prototype.fn1 = function(){}- 在自己的属性上找,没有就沿着__proto__找,如果没找到返回 undefined
Object.prototype.proto = null 原型链终点- 原型链是用来查找对象属性的
作用域是针对变量
原型链是针对构造函数
- 隐式原型链
- Fun.prototype的最终值是{}
- Object.prototype是原型链顶级
- Instanceof : 判断第一个参数的原型链上是否有第二个参数的构造函 数
看fun和Fun.prototype的值是怎么来的,fun是通过构造函数Fun来的, 所以fun.__proto__指向Fun.prototype,Fun.prototype的值是{},是通过 Object构造函数来的,所以Fun.__proto__指向Object.prototype- 例子
// fun Fun.prototype/{} Object.prototype
// Fun Function.prototype/{} Object.prototype
// Object Function.prototype/{} Object.prototype
// {} Object.prototype/{}
// 123 Number.prototype/{} Object.prototype
// Number Function.prototype/{} Object.prototype
- 原型链继承
- 改变prototype
Sub.prototype = new Supper()- 改变contructor
Sub.prototype.contructor = Sub
- 测试题
function Fun(){}
Fun.prototype.n = 1
var a = new Fun()
Fun.prototype = {
n:2,
m:3
}
// Fun.prototype.n = 2
// Fun.prototype.m = 3
var b = new Fun()
console.log(a.n,a.m,b.n,b.m) //1 undefined 2 3