我正在阅读javascript中的原型,在文章http://phrogz.net/js/classes/OOPinJS.html中我读到我们无法在javascript中的对象构造函数中分配公共方法?原型方法与静态方法的不同之处是什么?使用它们有什么好处?
答案 0 :(得分:2)
JavaScript并不适合大多数OOP概念和范例,尤其是在尝试模拟继承之后。不应该在OOP术语中考虑原型与“特权”方法,而应该根据JavaScript如何实例化对象来考虑事物。拿这个简单的“课堂”:
var id = 0;
function myClass()
{
var that = this;
id++; //closure, each new instance gets a unique id
this.id = id;
this.toString = function()
{
return that.id.toString();
}
}
这个类的实例化如下:
var classInstance = new myClass();
这不是我一定要推荐的模式,重点是要说明每个实例,每个实例都有自己唯一的toString
函数。这意味着如果您实例化100 classInstances
,并在其中一个上更改toString
以执行其他操作,则只有该实例具有该新功能。
也意味着对于每个实例,每个特权方法也会与它一起实例化。如果要实例化大量实例,那么可能会产生很大的性能差异。我有一个案例,通过将我的特权方法转换为原型方法,我看到了可测量的速度提升。
说到原型方法,这可能是这样的:
var id = 0;
function myClass()
{
id++; //closure, each new instance gets a unique id
this.id = id;
}
myClass.prototype.toString = function()
{
return this.id.toString();
}
在这种情况下,无论您拥有多少myClasses
,您只需实例化toString
方法一次。如果它发生变化,则会更改所有myClasses
。
就我个人而言,我在大多数JavaScript类中都使用特权方法,因为它看起来更干净,只有原型链才会打扰,如果我知道它会被实例化很多次。同样能够访问私有变量允许你有一些隐藏的信息,而不是被迫公开任何被访问的变量。
答案 1 :(得分:2)
我读到我们无法在javascript中的对象构造函数中分配公共方法吗?
是的,文章提到了这个:
function MyObj(name)
{
this.name = name;
}
MyObj.prototype.sayHello = function() {
alert('hello ' + this.name);
}
new MyObj('world').sayHello();
如您所见,公共方法sayHello()
在原型中声明,它在构造函数之外完成。这就是JavaScript的工作原理。
原型方法与静态方法的不同之处是什么?使用它们有什么好处?
原型方法仅“附加”到对象上。对于静态方法,您需要使用此构造:
var MyStaticThing = {
name: 'world',
sayHello: function() {
alert('hello ' + this.name);
}
}
MyStaticThing.sayHello();
答案 2 :(得分:1)
“使用它们的优势”......你指的是哪一个?通常,优点是使用原型方法(通常是对象构造),而不是像javascript中的静态或经典方法。你要找的答案真的太长了,不能在这里解决,但简短的回答是javascript基于一个原型对象继承系统(意思是对象可以在运行中创建并可以继承到另一个),而不是经典系统(对象可能只从类继承,即Java,C ++等)
虽然你可以用经典的方式在javascript中创建对象 - 因为语言是灵活的 - 这是一种糟糕而混乱的方式。原型对象构造允许您执行重要和好的事情,如数据隐藏,访问超级方法等。就像我说这是一个冗长的主题,真的很大,可以在一个小文本框中使用。