JavaScript 原型链基础详解

  1. 在面向对象编程中,类和对象可想象为铸模和铸件地关系,对象总是从类中创建。

  2. 在原型编程地思想中,类不是必须的,对象也不一定从类中创建。对象是通过克隆另一个对象得到的,如果需要一个和某对象一摸一样的对象,就可以用原型模式

  3. Object.create可以用来克隆对象

    var Plane = function(){ 
     this.blood = 100; 
     this.attackLevel = 1; 
     this.defenseLevel = 1; 
    }; 
    var plane = new Plane(); 
    plane.blood = 500; 
    plane.attackLevel = 10; 
    plane.defenseLevel = 7; 
    var clonePlane = Object.create( plane ); 
    console.log( clonePlane ); // 输出:Object {blood: 500, attackLevel: 10, defenseLevel: 7}
    

    在不支持 Object.create 方法的浏览器中,则可以使用以下代码:

    Object.create = Object.create || function( obj ){ 
     var F = function(){}; 
     F.prototype = obj; 
     return new F(); 
    }
    
  4. 克隆是创建对象的手段

原型链

假设有一原型链 : Object=>Animal=>Dog

当我们尝试调用Dog对象的方法,而它本身却没有这个方法时,那么这个对象会把这个请求委托给它的原型Animal,并顺着原型链委托下去,直至找到该方法或者到达根对象。

JavaScript中的原型继承

  1. 按照 JavaScript 设计者的本意,除了 undefined 之外,一切都应是对象。为了实现这一目标,number、boolean、string 这几种基本类型数据也可以过“包装类”的方式成对象类型数据来处理。

  2. js中的根对象是Object.prototype空对象。

  3. js中的函数既可以当作普通函数使用,也可以作为构造器调用。当使用new运算符调用函数时,这个函数就是构造器

  4. 就js的真正实现,并不能说对象有原型,而只能说对象的构造器有原型,对象把请求委托给它的构造器的原型。

  5. js给对象提供了一个命为proto隐藏对象,proto指向构造器的原型对象,{Constrctor}.prototype

  6. 手动给新建对象设置正确得 __ proto __ 指向可使用

    obj.__proto__ = Constructor.prototype
    
  7. js的对象最初都是由Object.prototype对象克隆而来,但是对象构造器的原型可以动态指向其他对象,从而达到继承的效果。

  8. 实现一个”类“继承另一个类的效果

    var A = function(){}
    A.prototype = {name:'sven'}
    var B = function(){}
    B.prototype = new A()
    var b = new B()
    console.log(b.name)
    
    • 尝试遍历b的所有属性,没有找到name
    • 将请求委托给b的构造器的原型,它通过b.__ proto __ 指向 B.prototype,B的原型是一个由A构造器创造出来的对象
    • 在B的原型中依然没有找到name属性,于是将请求委托给new A()对象的构造器原型 A.prototype
    • 在A.prototype中找到name属性,并返回他的值
  9. 继承总是发生在对象与对象之间

  10. Object.prototye的原型是null,当请求委托到此却没与找到相应属性时,返回undefined

  11. 设计模式是对语言不足的补充

  12. 通过设置构造器原型来实现原型继承时,初根对象Object.prototype本身外,任何对象都会有一个原型。而通过Object.create(null)可以创建出没有原型的对象。(Object.create创建对象的效率不高)

  13. Es6的class语法,其背后仍是通过原型机制创建对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值