javaScript原型链
概念
JavaScript之继承(原型链)
数据结构
var Person = function(){};
Person.prototype.type = 'Person';
Person.prototype.maxAge = 100;
分支主题
prototype(原型)
constructor(构造方法)
Person.prototype.constructor === Person;
自己的构造,指向自己. 无限循环
proto(原型链)
Person.prototype.proto === Object.prototype
指向Object对象prototype(原型)
proto(原型链/遗传进化链)
第一层指向,Function对象prototype(原型)
分支主题
Person.proto === Function.prototype
同时Function对象的proto(原型链)也指向Function的prototype(原型)
Function.proto === Function.prototype
第二层指向,Object对象prototype(原型)
分支主题
Person.proto.proto === Object.prototype
第三次指向,null
Person.proto.proto.proto === null
var p = new Person();
console.log(p.maxAge);
p.name = 'rainy';
分支主题
实例对象没有prototype原型属性
仅具有proto(原型链)
第一层指向,Person对象prototype(原型)
new Person().proto === Person.prototype
第二层指向,Object对象prototype(原型)
new Person().proto.proto == Object.prototype
第二层指向,还等同Person对象的第二层指向
new Person().proto.proto === Person.proto.proto
第三次指向,null
new Person().proto.proto.proto === null
prototype、proto的关系
dir(Array)
分支主题
dir(new Array())
new Array().proto === Array.prototype
true
Array.prototype
分支主题
Array.
分支主题
可访问form直接方法
也可访问Array.proto内方法
也可访问Array.proto.proto.... 内方法[继承]
检验是否非进化链proto继承的属性
分支主题
.hasOwnProperty("")
构造指向自己
Array.prototype.constructor === Array
true
Array.prototype.constructor.prototype.constructor.prototype.constructor ....
function Array() { [native code] }
proto
分支主题
遗传进化链 or 进化链指针
进化链指针
new String().proto === String.prototype
JS内置构造器和自定义函数都是Function构造器的原型(prototype)
Array.proto === Function.prototype
true
String.proto === Function.prototype
true
Function.proto === Function.prototype
true
只有Function.prototype是函数(function)类型
分支主题
为了保证函数构造器们的proto指向的都是函数
不能new的目标
分支主题
没有构造函数(不是函数),不能new
分支主题
分支主题
function才有构造,object没有
继承控制
Object
Object.setPrototypeOf(child, parent);
Object.prototype.extend
class
class Porsche extends Car
function
inherits(Chinese, People) & People.call(this, name, age)
inherits(Chinese, People)
分支主题
分支主题
分支主题
作用
child.prototype = Object.create(parent.prototype)
通过prototype的覆盖获得parent所有的数据结构
注意,覆盖会造成自身数据结构的丢失
如需自定义数据结构需要在inherits()后赋予
People.call(this, name, age)
分支主题
分支主题
作用
调用call,使用当前this(English)执行People函数
构造 Constructor
声明对象
分支主题
实例对象
分支主题
网友评论