JS基础知识(2)-原型

每个函数都有 prototype 属性,除了 Function.prototype.bind(),该属性指向 原型。 

每个对象都有 __proto__ 属性,指向了创建该对象的构造函数的原型。其实这个 属性指向了 [[prototype]],但是 [[prototype]] 是内部属性,我们并不能访问到, 所以使用 _proto_ 来访问。 对象可以通过 __proto__ 来寻找不属于该对象的属性,__proto__ 将对象连接起 来组成了原型链。 

一个对象除了自身的显示属性外还隐含一个_proto_属性,这个属性指向创建该对象的构造函数的原型。

如:

let foo={ //内部也是使用了 new Object() 
   x: 10,
   y: 20
}

假设拥有两个对象,它们之间只有一小部分不同,其他部分都相同。显然,我们将会重用相似的功能/代码,如下calculate函数以及变量x为对b,c公用,则可以

var a = {
      x: 10,
     calculate: function (z) {
        return this.x + this.y + z
      }
 
};

var b = {
  y: 20,
  __proto__: a
};

var c = {
  y: 30,
  __proto__: a
};

通过构造函数来实现相同部分,也就是用构造函数来代替上述a的功能


function Foo(y) { // function 就是个语法糖 内部等同于 new Function() 

  this.y = y;
}

Foo.prototype.x = 10;

Foo.prototype.calculate = function (z) {
  return this.x + this.y + z;
};

var b = new Foo(20);
var c = new Foo(30);

代码关系如下图: 

 

每个对象都有一个原型。构造函数Foo也有自己的__proto__,值为Function.prototypeFunction.prototype也通过其__proto__属性关联到Object.prototype

对象可以通过 __proto__ 来寻找不属于该对象的属性,__proto__ 将对象连接起 来组成了原型链。 

在ES6中有了类:

class Foo {
constructor(name) {
this._name = name;
}
  getName() {
    return this._name;
  }
}

class Bar extends Foo {
  getName() {
    return super.getName() + ' Doe';
  }
}

var bar = new Bar('John');
console.log(bar.getName()); // John Doe

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值