javascript - prototype.constructor 和 object of itself 有什么区别?

标签 javascript oop

<分区>

我正在尝试理解面向对象的 JavaScript 并坚持使用一些示例。它们似乎有点不同的传统 OOP。

首先,与那些有什么区别:

function Foo()
{
    this.bar = function ()
    {
        // ...
    };
}

对比

function Foo() {}

Foo.prototype.bar = function()
{
    // ...
}

另外,我应该使用哪一个?哪一个是正确的方法?


工厂模式的另一个例子。

function Circle()
{
    this.say = function() { console.log('I am circle.'); };
}

function Square()
{
    this.say = function() { console.log('I am square.'); };
}

function chooseShape(decision)
{
    var shape = null;

    if (decision === "Circle")
    {
        shape = Circle; // or Circle.prototype.constructor;
    } else if (decision === "Square")
    {
        shape = Square; // or Square.prototype.constructor;
    }

    return new shape();
}

如果我用这些改变这些行:

if (decision === "Circle")
{
    shape = Circle.prototype.constructor;
} else if (decision === "Square")
{
    shape = Square.prototype.constructor;
}

它们按预期工作,但我想知道引擎盖下发生了什么。

最佳答案

原型(prototype)上的函数只创建一次并在每个实例之间共享。对于使用构造函数创建的每个新对象,在构造函数中创建的函数都创建为新对象。

作为一般规则,函数应该在原型(prototype)上,因为它们通常不会针对相同类型的不同对象进行修改,并且这具有轻微的内存/性能优势。其他属性(如对象和数组)应在构造函数中定义,除非您想创建一个共享的静态属性,在这种情况下您应该使用原型(prototype)。

希望这能回答你的问题

关于javascript - prototype.constructor 和 object of itself 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39619577/

相关文章:

java - 将患者添加到我实现的链表类中

javascript - 将 JsonArray 数据从 serveResource 传递到 jsp 并在 JSP 上显示 - Liferay

c# - 将方法绑定(bind)到实现类

c++ - 只有公共(public)静态方法的帮助类

javascript - 为什么我的网络应用程序不会将数据发送到我的 google firebase 数据库?

java - BukkitRunnable 中的 'this'

java - 为什么我不应该将 equals 与继承一起使用?

javascript - 编译转换 : The type or namespace name could not be found when running TypeLite. tt

javascript - 将 javascript 注入(inject) iframe 的最佳方法

javascript - 哪些 JavaScript 库将处理弹出窗口(例如 Meebo 或 Gmail 聊天窗口)?