当谈到继承时,JavaScript 只有一种结构:对象。每个实例对象(object )都有一个私有属性(称之为 __proto__)指向它的原型对象(prototype)。该原型对象也有一个自己的原型对象 ,层层向上直到一个对象的原型对象为 null
。根据定义,null
没有原型,并作为这个原型链中的最后一个环节。
几乎所有 JavaScript 中的对象都是位于原型链顶端的Object
的实例。
从 ECMAScript 6 开始,[[Prototype]]
可以通过Object.getPrototypeOf()
和Object.setPrototypeOf()
访问器来访问。这个等同于 JavaScript 的非标准但许多浏览器实现的属性 __proto__
。(当使用 obj.__proto__ 时,可以理解成返回了 Object.getPrototypeOf(obj))
function Graph() {
this.vertices = [];
this.edges = [];
}
Graph.prototype = {
addVertex: function(v){
this.vertices.push(v);
}
};
var g = new Graph();
g.__proto__ == Graph.prototype // 与 Object.getPrototypeOf(g) == Graph.prototype 等价
//true
ps:
function Person() { } var person = new Person(); typeof Person; //function typeof person; //object
1.每个函数都有一个 prototype 属性,prototype是函数才会有的属性。
2.每一个JavaScript对象(除了 null )都具有的一个属性,叫__proto__,这个属性会指向该对象的原型。
(1)对象的原型和原型链
对象的原型对象都是 Object.prototype,Object.prototype 的原型是 null。
var o = {a: 1};
Object.getPrototypeOf(o) == Object.prototype
//true 即:对象 o 的原型是 Object.prototype
Object.getPrototypeOf(Object.prototype)
//null 即:Object.prototype 的原型是 null
// 原型链如下:
// o ---> Object.prototype ---> null
(2)数组的原型和原型链
数组的原型都是 Array.prototype,Array.prototype 的原型是 Object.prototype。
var a = [1,2,3]
Object.getPrototypeOf(a) == Array.prototype;
//true 即:数组 a 的原型是 Array.prototype
Object.getPrototypeOf( Array.prototype ) == Object.prototype;
//true 即:数组原型的原型是对象原型 Array.prototype
// 原型链如下:
// a ---> Array.prototype ---> Object.prototype ---> null
(3)函数的原型和原型链
函数的原型都是 Function.prototype,Function.prototype 的原型是
Object.prototype。
function f(){
return 2;
}
Object.getPrototypeOf(f) == Function.prototype
//true 即:函数 f 的原型是 Function.prototype
Object.getPrototypeOf(Function.prototype) == Object.prototype
//true 即:函数原型的原型是 Object.prototype
// 原型链如下:
// f ---> Function.prototype ---> Object.prototype ---> null
遍历对象的属性时,原型链上的每个可枚举属性都会被枚举出来。要检查对象是否具有自己定义的属性,而不是其原型链上的某个属性,则必须使用所有对象从Object.prototype
继承的 hasOwnProperty 方法。
hasOwnProperty
是 JavaScript 中唯一处理属性并且不会遍历原型链的方法。
参考: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Inheritance_and_the_prototype_chain