话很少说,直接开始正题吧.今天就是JavaScript基础篇第二部分 - 原型和原型链javascript
原文地址: 一名【合格】前端工程师的自检清单前端
JavaScript
中的原型规则是指原型实例指向建立对象的种类,并经过拷贝这些原型建立新的对象,是一种用来建立对象的模式,也就是建立一个对象做为另外一个对象的prototype
属性。java
_proto_
属性(隐式原型),属性值是一个普通对象;obj.proto === Object.prototype
)_proto_
(即它的构造函数的prototype)中去寻找;instanceof
的底层实现原理,手动实现一个instanceof
instanceof
的底层实现原理:es6
我我的理解是从当前引用的proto
一层一层顺着原型链往上找,可否找到对应的prototype
。找到了就返回true
设计模式
手动实现: 如下这段代码应该是最基础的instanceof
的实现代码了数组
function instance_of(L, R) {//L 表示左表达式,R 表示右表达式
var O = R.prototype; // 取 R 的显示原型
L = L.__proto__; // 取 L 的隐式原型
while (true) {
if (L === null)
return false;
if (O === L) // 当 O 显式原型 严格等于 L隐式原型 时,返回true
return true;
L = L.__proto__;
}
}
复制代码
Cat.prototype = new Animal();
浏览器
特色:babel
缺点:前端工程师
new Animal()
这样的语句以后执行,不能放到构造器中function Cat(name){
Animal.call(this);
this.name = name || 'Tom';
}
复制代码
特色:闭包
call
多个父类对象)缺点:
function Cat(name){
var instance = new Animal();
instance.name = name || 'Tom';
return instance;
}
复制代码
特色:
new 子类()
仍是子类()
,返回的对象具备相同的效果缺点:
function Cat(name){
var animal = new Animal();
for(var p in animal){
Cat.prototype[p] = animal[p];
}
Cat.prototype.name = name || 'Tom';
}
复制代码
特色:
缺点:
for in
访问到)function Cat(name){
Animal.call(this);
this.name = name || 'Tom';
}
Cat.prototype = new Animal();
Cat.prototype.constructor = Cat;
复制代码
特色:
缺点:
function Cat(name){
Animal.call(this);
this.name = name || 'Tom';
}
(function(){
// 建立一个没有实例方法的类
var Super = function(){};
Super.prototype = Animal.prototype;
//将实例做为子类的原型
Cat.prototype = new Super();
})();
Cat.prototype.constructor = Cat;
复制代码
特色:
缺点:
class Cat extends Animals {}
特色:
缺点:
polyfill
Node
)中应用原型继承的案例这个案例就不一一列举了,感兴趣的同窗能够自行查阅开源项目源码.
new
一个对象的详细过程,手动实现一个new
操做符如下答案转载自MDN - new 运算符:
new 运算符建立一个用户定义的对象类型的实例或具备构造函数的内置对象的实例。new 关键字会进行以下的操做:
//本身定义的new方法
let newMethod = function (Parent, ...rest) {
// 1.以构造器的prototype属性为原型,建立新对象;
let child = Object.create(Parent.prototype);
// 2.将this和调用参数传给构造器执行
Parent.apply(child, rest);
// 3.返回第一步的对象
return child;
};
复制代码
es6 class
构造以及继承的底层实现原理ES6类的底层仍是经过构造函数以及原型链继承实现,具体实现能够参考babel编译成的es5代码实现.
系列连接: