原型和原型链

原型(空的实例对象)

  • 每个函数都有一个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

posted @ 2021-02-21 21:43  abcdefgab  阅读(74)  评论(0)    收藏  举报