【问题标题】:Javascript and prototypal InheritanceJavascript 和原型继承
【发布时间】:2011-08-20 22:37:11
【问题描述】:

这两个语句在 Javascript 中有区别吗?

function p() {
    this.do = function(){alert('cool')};
}

还有这个?:

function p(){};

p.prototype.do = function(){alert('cool')};

还有一件事,你为什么不能做:

function p(){};

p.do = function(){alert('cool')};

非常感谢!

【问题讨论】:

  • p 是作为构造函数调用还是作为常规函数调用? (那种有很大的不同:)
  • 构造函数...我认为....我不完全确定,我是新手,抱歉 :(
  • 等等,是的构造函数。我很确定
  • p.do = ...p 构造函数本身上创建一个 do 属性。但是,p 实例(例如 var p1 = new p();)继承自 p.prototype 对象,而 not 继承自 p 函数对象本身。这就是为什么你“做不到”。

标签: javascript function inheritance prototype-programming prototypal-inheritance


【解决方案1】:

鉴于您的前两个示例,假设您调用 p() 作为构造函数:

  • 表面上,它们的行为是相同的

但是第一个例子……

  • 将为从new p() 创建的每个对象创建一个新的、相同的函数
  • [那个函数]可以访问p()构造函数中的局部变量和参数
//                                    p.prototype = {}
new p(); // { do:function(){alert('cool')}; } ------^
new p(); // { do:function(){alert('cool')}; } ------^
new p(); // { do:function(){alert('cool')}; } ------^

第二个例子……

  • 将在从new p()创建的所有对象之间共享放置在原型上的函数
  • [那个函数] 将无法访问构造函数中的私有变量/参数
//p.prototype = {do:function(){alert('cool')};}
new p(); // {} ------^
new p(); // {} ------^
new p(); // {} ------^

第三个示例不起作用,因为在 JavaScript 中,函数是一个对象,所以您所做的只是在该对象上放置一个新属性。它对该函数的调用没有影响。

【讨论】:

  • 还有一个问题,可以这么说,哪个“更好”?
  • @Nathan:两者都不是。这一切都取决于你需要什么。如果函数不需要访问构造函数中的私有局部变量,那么一定要把它放在prototype 对象上,这样您就不会不必要地重新创建函数。如果确实需要访问,那么您确实需要在构造函数中创建该函数。有一些模式有点棘手,它们试图保持私有变量私有,但通过prototype 上的函数提供访问,但我不知道是否有任何解决方案真正实现它。
【解决方案2】:

从功能上讲,它们是相同的。

第一个为每个对象 var o = new p() 定义了一个函数,因此从内存的角度来看它不是最佳的。

可以做您在第三个示例中展示的内容,但您不会完成您的想法:

function p(){};

p.do = function(){alert('cool')};

p.do(); // this will work

var o = new p(); // This won't have the 'do' function because that's not how it works in javascript.

【讨论】:

    猜你喜欢
    • 2013-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2010-09-28
    • 2018-02-21
    • 1970-01-01
    相关资源
    最近更新 更多