专栏名称: JavaScript
面向JavaScript爱好人员提供:前端最新资讯、原创内容、JavaScript、HTML5、Ajax、jQuery、Node.js等一系列教程和经验分享。
目录
相关文章推荐
51好读  ›  专栏  ›  JavaScript

构造函数内的方法与构造函数prototype属性上方法的对比

JavaScript  · 公众号  · Javascript  · 2017-03-21 10:44

正文

转自:https://github.com/dreamapplehappy/hacking-with-javascript/blob/master/points/methods-within-constructor-vs-prototype-in-javascript.md


本文的目的是让大家理解什么情况下把函数的方法写在JavaScript的构造函数上,什么时候把方法写在函数的prototype属性上;以及这样做的好处。


为了阅读方便,我们约定一下:把方法写在构造函数内的情况我们简称为函数内方法,把方法写在prototype属性上的情况我们简称为prototype上的方法

首先我们先了解一下这篇文章的重点:

  • 函数内的方法 : 使用函数内的方法我们可以访问到函数内部的私有变量,如果我们通过构造函数new出来的对象需要我们操作构造函数内部的私有变量的话, 我们这个时候就要考虑使用函数内的方法。

  • prototype上的方法 : 当我们需要通过一个函数创建大量的对象,并且这些对象还都有许多的方法的时候;这时我们就要考虑在函数的prototype上添加这些方法. 这种情况下我们代码的内存占用就比较小。

  • 在实际的应用中,这两种方法往往是结合使用的;所以我们要首先了解我们需要的是什么,然后再去选择如何使用。

我们还是根据下面的代码来说明一下这些要点吧,下面是代码部分:

// 构造函数A

function A(name) {

   this.name = name || 'a';

   this.sayHello = function() {

       console.log('Hello, my name is: ' + this.name);

   }

}

 

// 构造函数B

function B(name) {

   this.name = name || 'b';

}

B.prototype.sayHello = function() {

   console.log('Hello, my name is: ' + this.name);

};

 

var a1 = new A('a1');

var a2 = new A('a2');

a1.sayHello();

a2.sayHello();

 

var b1 = new B('b1');

var b2 = new B('b2');

b1.sayHello();

b2.sayHello();

我们首先写了两个构造函数,第一个是A,这个构造函数里面包含了一个方法sayHello;第二个是构造函数B, 我们把那个方法sayHello写在了构造函数B的prototype属性上面。

需要指出的是,通过这两个构造函数new出来的对象具有一样的属性和方法,但是它们的区别我们可以通过下面的一个图来说明:

我们通过使用构造函数A创建了两个对象,分别是a1,a2;通过构造函数B创建了两个对象b1,b2;我们可以发现b1,b2这两个对象的那个sayHello方法 都是指向了它们的构造函数的prototype属性的sayHello方法.而a1,a2都是在自己内部定义了这个方法. 定义在构造函数内部的方法,会在它的每一个实例上都克隆这个方法;定义在构造函数的prototype属性上的方法会让它的所有示例都共享这个方法,但是不会在每个实例的内部重新定义这个方法. 如果我们的应用需要创建很多新的对象,并且这些对象还有许多的方法,为了节省内存,我们建议把这些方法都定义在构造函数的prototype属性上。

当然,在某些情况下,我们需要将某些方法定义在构造函数中,这种情况一般是因为我们需要访问 构造函数内部的私有变量。

下面我们举一个两者结合的例子,代码如下:

function Person(name, family) {

   this.name = name;

   this.family = family;

 

   var records = [{type: "in", amount: 0}];

 

   this.addTransaction = function(trans) {

       if(trans.hasOwnProperty("type") && trans.hasOwnProperty("amount")) {

          records.push(trans);

       







请到「今天看啥」查看全文