“可接受/良好的Javascript操作方式”;“类”;(哎呀)?
很长一段时间以来,我一直在想如何正确地使用Javascript,我读过相关文章,但自己从未真正尝试过任何东西。我选择使用“可接受/良好的Javascript操作方式”;“类”;(哎呀)?,javascript,oop,object,Javascript,Oop,Object,很长一段时间以来,我一直在想如何正确地使用Javascript,我读过相关文章,但自己从未真正尝试过任何东西。我选择使用Object.create方法。Object.create的缺点是没有构造函数,这是我比较喜欢的。所以我想出了我自己的方法 我的问题很简单——这是一种很好的Javascript OOP方法吗 编辑:更新了Object.init edit2:删除内联代码并添加pastebin链接我将首先回答您的问题,说明我将如何实现您的目标,然后向您介绍我将如何以不同的方式实现它 您的方式当然
Object.create
方法。Object.create
的缺点是没有构造函数,这是我比较喜欢的。所以我想出了我自己的方法
我的问题很简单——这是一种很好的Javascript OOP方法吗
编辑:更新了Object.init
edit2:删除内联代码并添加pastebin链接我将首先回答您的问题,说明我将如何实现您的目标,然后向您介绍我将如何以不同的方式实现它 您的方式当然是一种方式,但当人们使用JS OOP风格时,我倾向于退缩,因为它是一种原型语言。这太大了,不能在这里讨论,但你应该读一下Douglas Crockford的——他被认为是JS的权威之一,如果我没记错的话,他多年来一直是雅虎的首席JS框架工程师。这将帮助您了解如何通过JS实现OOP 然而,JS并不是真正打算这样使用的。JS是一种原型语言,你可以用原型来实现大量的事情——其实没什么不同 既然您提到您一直在想如何“正确地使用javascript”,我想说以下几点:如果我要实现您想要的,即向所有对象添加init方法,我会以对象的原型为目标:
Object.prototype.init = function(){...}
模块化Javascripting的一个真正可靠的方法是创建一个具有如下定义原型的函数类型:
var CalendarObject = function(){} //<-- Essentially a class definition
CalendarObject.prototype = {
init:function(){
//Do init stuff
},
launchYear2k:function(){
//Destroy the world
}
}
您可以像大多数OOP风格的构造函数一样对其进行编码。调用new CalendarDefinition()时,将执行您在CalendarObject定义函数中输入的任何内容。这意味着您可以根据需要自动调用init函数,也可以初始化变量等
一个重要的好处是protypes是JSON对象。就这样。如果你知道JSON,你就会明白它有多么强大。阅读Crockford的网站,你可以开始了解如何制作getter和setter,如果你想要这种类型的功能,但这实际上是编写javascript的“正确”方法,具体取决于你所谈论的阵营。从技术上讲,这比使用OOP样式更快/更节省内存,因为所有对象都引用全局CalendarObject,而不是每次都创建一个新对象
那只是我的两分钱 看看类似的问题。
另外,请查看MDN。
JavaScript是一种基于原型的语言。除非您愿意,否则您不需要想出自己的方法来定义构造函数;JavaScript已经支持它自己的方法
//constructor
function Ninja(name) {
this.name = name;
}
//the "class"
Ninja.prototype = {
swung: false,
swingSword: function() {
this.swung = !this.swung;
},
get: function(prop) {
return this.prop;
},
set: function(prop,val) {
this.prop = val;
}
}
//instantiation
var awesomeNinja = new Ninja('Jet Li');
//show a member
awesomeNinja.get('name'); //Jet Li
//some random method
awesomeNinja.swingSword(); //this.swung = true
可能重复我以前也这样做过,老实说,我更喜欢我的方式。在我这样做的时候,有没有什么我错过的?(我知道,
Object.create
在旧浏览器中不受支持,但对于这个项目,我不在乎)你错过了理解你的代码的人。尝试新事物绝对不是犯罪,但你在这里谈论的是重新发明轮子。另外,请仔细阅读Crockford的书,书中深入介绍了这一点。好吧,我看到了一种说法,原型是旧的,对象。创建
是新的方法。我没有看完整个视频,所以我可能错过了什么。我重新编写了一段代码,看起来像现在一样(很抱歉里面有这么多评论)。是这样吗?是的,看起来这样可以很好。我提醒你要明白,“原型是旧的”是一个错误的说法。这就像说C++中的经典继承或者甚至像数组一样的结构都是旧的——当然它们是“旧的”;它们是语言的结构,是语言独特的结构。“Object.create是一种新的方式”,我想可能是指“Object.create”可能是当前新兴的行业标准,用于在javascript中模拟OOP经典继承技术。但对象原型不会很快消失。这是JS的一部分!:)
//constructor
function Ninja(name) {
this.name = name;
}
//the "class"
Ninja.prototype = {
swung: false,
swingSword: function() {
this.swung = !this.swung;
},
get: function(prop) {
return this.prop;
},
set: function(prop,val) {
this.prop = val;
}
}
//instantiation
var awesomeNinja = new Ninja('Jet Li');
//show a member
awesomeNinja.get('name'); //Jet Li
//some random method
awesomeNinja.swingSword(); //this.swung = true