我们可以在对象构造函数中分配一个公共方法吗?(javascript)
Can we assign a public method inside a object constructor ? (javascript)
我在一篇文章中读到了javascript中的原型http://phrogz.net/js/classes/OOPinJS.html我读到我们不能在javascript中的对象构造函数内分配公共方法?原型方法与静态方法有何不同?使用它们有什么好处?
我读到我们不能在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();
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类中都使用特权方法,因为它看起来更干净,只有当我知道原型链将被实例化大量时,它才会麻烦原型链。此外,能够访问私有变量可以让你在某种程度上隐藏信息,而不是被迫公开任何访问的变量。
"使用它们的优势"。。。你指的是哪一个?一般来说,优势在于使用原型方法(通常是对象构造),而不是javascript中的静态或经典方法。您要寻找的答案实在太长了,无法在这里解决,但简短的答案是javascript基于原型对象继承系统(意味着对象可以动态创建,并且可以从一个继承到另一个),而不是经典系统(对象只能从类继承,即Java、C++等)
虽然你可以用javascript以经典的方式创建对象,因为这种语言非常灵活,但这是一种糟糕而混乱的方法。原型对象构建可以让你做一些重要而好的事情,比如数据隐藏、访问超级方法等。就像我说的,这是一个冗长的主题,真的太大了,可以在一个小文本框中进行处理。
- 将一个方法转换为promise:Nodejs
- 如何在所有ng点击事件AngularJS上启动一个方法
- 创建一个方法,通过一个窗口进行迭代并获取Titanium中的所有控件
- 如何创建一个方法来验证数组的范围
- 如何将一个方法延迟到另一个方法首先完成,javascript
- 在Javascript中对类的每个实例调用一个方法
- 如何重写一个方法,并且仍然能够在重写的方法中使用基方法
- NodeJS-从同一文件中的另一个方法调用一个方法
- 有没有任何情况下,一个方法不应该是原型方法
- Jasmine间谍的函数称为一个方法
- 在带有参数列表的表单submit上调用一个方法
- 方法不在另一个方法内部调用
- 在 1 个方法中增加变量值会触发另一个方法的 for 循环,欢迎任何建议
- 如何使用javascript express node将变量从控制器中的一个方法公开.js到另一个控制器.js
- 如何在javascript中将变量的值分配给另一个方法
- 在浏览器关闭时,单击确认对话框中的“停留在页面上”,执行一个方法
- 使用一个方法在c#中启动其他方法
- 如何在Ember中转换到另一个路由时调用一个方法
- 在typescript中重载一个方法
- 我可以在setInterval函数中放入一个方法作为参数吗