3

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

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

和这个?:

function p(){};

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

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

function p(){};

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

太感谢了!

4

2 回答 2

3

给定您的前两个示例,假设您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 中,函数是一个对象,因此您所做的只是在该对象上放置一个新属性。它对该函数的调用没有影响。

于 2011-08-20T22:48:22.843 回答
0

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

第一个为每个对象定义了一个函数,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.
于 2011-08-20T22:47:39.490 回答