理解js中的原型链

谈原型链之前先说说关键字new
var obj = new object();
这是一句简单的利用构造器创建一个对象,但是其中经过了三个步骤:
  1. var obj = {};创建一个空对象obj
  2. obj. _ proto_ = object.prototype;将obj的_ proto_属性指向object的 prototype成员对象,由此建立了原型链:
    obj—>object.prototype—>Object.prototype—>null
  3. object.call(obj);初始化obj即给obj赋值

这里解释一下 _ proto_ :
每一个对象都有一个 _ proto_ 属性,它的 _ proto_ 又会有一个 _ proto_ ,它的 _ proto_ 的 _ proto_ 也有 _ proto_ ,以此类推到null。也就是说当寻找object的某个属性或方法时,如果本身没有就在它的 _ proto_ 里找,如果也没有就在它的 _ proto_ 的 _ proto_ 里找,直到找到最后,这就是原型链的思想。然而 _ proto_ 并不能对外公开,譬如这样:

       function object () {
            this.name = 'lulu';
            this.age = 21;
        }
        object.prototype = {
            getInfo : function(){
                return 'name:' + this.name + 'age:' + this.age;
            }
        };
        var obj = new object();
        console.log(obj);

输出结果是:这里写图片描述
然而输出 console.log(obj._ proto_);却是undefined,也就说明了_ proto_是一个私有属性的事实。

再来一个复杂一点的代码:
    var Person = function () { };
    Person.prototype.Say = function () {
      alert("Person say");
    }
    Person.prototype.Salary = 50000;
    var Programmer = function () { };
    Programmer.prototype = new Person();
    Programmer.prototype.WriteCode = function () {
        alert("programmer writes code");
    };
    Programmer.prototype.Salary = 500;
    var p = new Programmer();
    p.Say();
    p.WriteCode();
    alert(p.Salary);
这里就很好理解了,原型链是这个样子的:

p—>Programmer—>Person—>Object—>null

现在说说new和Object.create()吧
new Object()是一种通过构造函数来创建对象的方式,看看Object.create()的本质吧
if (!Object.create) {
    Object.create = function (o) {
    function F() {}  //定义了一个隐式的构造函数
    F.prototype = o;
    return new F();  //其实还是通过new来实现的
    };
  }
一般是这样,new Object()针对于原型对象是函数的情况,Object.create针对于原型对象是对象的情况所以在实际中要区别它们的用法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值