JavaScript原型&原型链&对象继承

原型:函数里的__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]'   说明是数组




转载于:https://juejin.im/post/5b724336f265da27d96ef21c

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值