原型链类
- 创建对象有几种方法
- 原型、构造函数、实例、原型链
- instanceof原理
- new运算符
创建对象的方法
// 第一种方式:字面量
var o1 = {name: 'o1'};
var o2 = new Object({name: 'o2'});
// 第二种方式:构造函数
var M = function (name) { this.name = name; };
var o3 = new M('o3');
// 第三种方式:Object.create
var p = {name: 'p'};
var o4 = Object.create(p);//o4.__proto__===p
M.prototype.say = function () {
console.log('say hi');
};
var o5 = new M('o5');
原型、构造函数、实例、原型链
结合上面的例子
M.prototype.constructor===M//true
o3.__proto__===M.prototype//true
M.__proto__===Function.prototype//true M本身没有__proto__属性,是顺着原型链向上找的
Object.prototype是原型链的顶端
instanceof原理
一直沿着原型链想上找,如果有就返回true
https://blog.csdn.net/weixin_43590947/article/details/84310045
我的这篇文章中有演示代码
new运算符
原理如下
var new2 = function (func) {
var o = Object.create(func.prototype);
var k = func.call(o);
if (typeof k === 'object') {
return k;
} else {
return o;
}
};
先指定传入构造函数的原型对象
再执行func指定返回结果为K
将func方法中的this指向func.prototype
然后判断K是否是对象,如果是则返回K,如果不是则返回传入构造函数的原型对象的空的实例对象。