javascript - 原型(prototype)与函数定义

标签 javascript function prototype

<分区>

假设我有以下功能

function FooController (){
  this.foo = function () {
    alert('foo');
  }
}

FooController.prototype.bar = function () {
  alert('bar');
}

这两种语法有区别吗?为什么我要用一个而不是另一个?性能受到影响吗?

最佳答案

如果它是在原型(prototype)上定义的,FooController 的任何实例都将“继承”bar 方法,因为它在实例的原型(prototype)链中。使用此技术仅定义了 1 个函数并在内存中。

如果您使用 this.foo = function 进行定义,则您会将函数作为该实例的属性直接添加到实例中。这意味着您将在每个 Controller 实例的内存中拥有 1 个函数。

function FooController {}

FooController.prototype.hello = function() {
  console.log("world");
};

创建实例并检查原型(prototype)的值

var c = new FooController();
c.hello(); // "world"

这符合预期,但让我们直接在 c 实例上定义一个 hello 方法

c.hello = function() { console.log("cats"); };
c.hello(); // "cats"

我们仍然可以直接调用原型(prototype)方法

c.prototype.hello.call(c); // "world"

或者我们可以删除c实例上的hello属性

delete c.hello;

现在让我们再次调用我们的函数

c.hello; // "world"

回到使用原型(prototype)的方法!

关于javascript - 原型(prototype)与函数定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26288353/

相关文章:

c++ - 返回并调用动态字符串数组

c++ - 在函数中返回数组

javascript - 为什么在 JavaScript 对象中使用公共(public)方法?

mysql - Gradle 任务原型(prototype)设计

javascript - 如何在 P5js/JavaScript 中按名称循环函数

javascript - js创建高级原型(prototype)

javascript - DOM 操作 JavaScript - 为数组的每个元素创建一个函数

javascript - 如何使用 JQuery 在 Gridview 中获取文本框的 ID?

javascript - 检查 System.Gadget.Flyout.file 的值

javascript - 设计一个 7 列的周计划,水平滚动