3

这两个语句在Javascript中有区别吗?Javascript和原型继承

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

这一个?:

function p(){}; 

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

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

function p(){}; 

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

太谢谢你了!

+0

作为构造函数还是作为常规函数调用'p'? (这种 - 有很大的区别':)') –

+0

构造函数...我想....我不完全确定,我是新来的,对不起:( –

+0

等待,是的构造函数。 m很确定 –

回答

0

从功能上讲,它们是一样的。

第一个为每个对象定义了一个函数,因此从记忆的角度来看它并不是最优的。

可以做你在你的第三个例子展示了什么,但你不会实现你的想法:

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. 
+0

好吧,谢谢! –

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中,函数是一个对象,所以你只需要在该对象上放置一个新的属性即可。它对该函数的调用没有影响。

+0

令人惊叹的解释,非常感谢! –

+0

@Nathan:不客气。 :) – user113716

+0

但还有一个问题,哪一个更“好”,可以这么说呢? –