原型:函数里的__proto__
Object.create(对象,null) 创建对象
var test = {num: 2}
var obj = Object.create(test);
function Obj(){}
Obj.prototype.num = 1;
var obj1 = Object.create(Obj.prototype);
var obj2 = new Obj();
obj1与obj2一样
new 对象时做了什么?
1,实例化obj2
2,调用构造函数Obj的初始化属性和方法
3,指定实例对象的原型
//创建obj1空对象
var obj1 = Object.create(null); //里面没有__proto__,也就是说:不是所有的对象都继承于Object.prototype.
obj1.num = 1;
var obj2 = Object.create(obj1);
__proto__必须系统内置,可以改但是不可以自己造
原始值是没有属性的 undefined和null不能经过包装类
document.write() 打印时会经过隐式转换,转换成string。
var obj = Object.create(null)
所以 document.write(obj) 会报错,obj 没有原型,无法转换成string
原型链
沿着__proto__往上找原型上的属性
原型链的顶端(终点)是--Object.prototype
对象继承
子可以改父的引用值,不能改原始值
原始值的时候 子会给自己增加这个原始值属性
构造函数被实例化以后 返回this
普通函数返回 undefined
call apply改变this指向 这个是借用,不算继承,无法访问其原型属性
Student.prototype=Tearch.prototype 共有原型,也不算继承
使用如下方式实现继承:(企业级实现方案)--》圣杯模式
将以上封装
function inherit(Target, Origin){
function Buffer(){}
Buffer.prototype = Origin.prototype;
Target.prototype = new Buffer();
//为了看着清晰 加两条
Target.prototype.constructor = Target; //还原构造器
Target.prototype.super_class = Origin; //设置继承源
}
以上实现变为:
function Teacher(){}
function Student(){}
inherit(Student, Teacher)
圣杯模式继续包装:(企业级使用方法)模块化方法,自己开辟作用域,防止全局污染
var inherit = (function(){
var Buffer = function();
return function(Target, Origin){
Buffer.prototype = Origin.prototype;
Target.prototype = new Buffer();
Target.prototype.constructor = Target; //还原构造器
Target.prototype.super_class = Origin; //设置继承源
}
})();
实现与上一个一样
css圣杯模式 双飞翼
(详见 https://juejin.im/post/5b727ef5f265da27f949062b 案例3)
判断数组的方式:
Object.prototype.toString.call(arr)==='[object Array]' 说明是数组