Skip to content

原型链 #33

Open
Open
@conan1992

Description

@conan1992

原型

我们创建的每个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。如果按照字面意思来理解,那么prototype就是通过调用构造函数而创建的那个对象实例的原型对象。--来自红宝石书p147

原型链

访问对象的属性时,如果对象没有这个属性,就回去这个对象属性[[prototype]]指向的原型对象去找,而原型对象也可能有原型对象,直到找到属性或者原型对象不存在的时候,这样的一层关系就是原型链;

原型获取方式

  • Object.getPrototypeOf(object)
  • JavaScript 的非标准但许多浏览器实现的属性
__proto__

默认原型

所有引用类型默认都继承了 Object,而
这个继承也是通过原型链实现的。大家要记住,所有函数的默认原型都是 Object 的实例,因此默认原
型都会包含一个内部指针,指向 Object.prototype。这也正是所有自定义类型都会继承 toString()、
valueOf()等默认方法的根本原因。

确定原型和实例的关系

  • instanceof
instance instanceof Object
  • isPrototypeOf
var obj = new Object()
   function Person(){

   }
   var p1 = new Person()
   var obj = new Object()
   function Person(){

   }
   var p1 = new Person()
   console.log(p1 instanceof Object)//true
   console.log(Object.prototype.isPrototypeOf(p1))//true

应用

  • 实现继承
function SuperType(){ 
 this.property = true; 
}
SuperType.prototype.getSuperValue = function(){ 
 return this.property; 
}; 
function SubType(){ 
 this.subproperty = false; 
} 
//继承了 SuperType 
SubType.prototype = new SuperType(); 
SubType.prototype.getSubValue = function (){ 
 return this.subproperty; 
}; 
var instance = new SubType(); 
console.log(instance); //true

image
image
注:图片来源红宝石书P163

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions