我很长时间以来一直想知道如何正确地使用Javascript,而且我已经读过它但从未真正尝试过任何事情。我选择使用Object.create
方法。与Object.create
的con是没有构造函数,这是我有点像。所以我提出了我自己的"包括它的方式。
我的问题很简单 - 这是一个做Javascript OOP的好方法吗?
修改:已更新Object.init
edit2:删除了内联代码并添加了pastebin链接
答案 0 :(得分:3)
我首先回答你的问题,告诉我如何实现你的目标,然后向你提供我将如何以不同的方式实现目标。
你的方式肯定是这样做的一种方式,但是当人们使用JS OOP风格时我倾向于退缩,因为它是一种原型语言。在这里讨论它太大了,但是你应该阅读Douglas Crockford的Classical Inheritance in Javascript - 如果我没记错的话,他被认为是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
}
}
要使用此功能,您只需创建一个“新”日历对象:
var c = new CalendarObject();
您可以像大多数OOP样式构造函数一样编写代码。当您调用new CalendarDefinition()时,将在CalendarObject定义函数中放置任何内容。这意味着你可以根据需要自动调用init函数,你可以初始化变量等。
对此有一个重要的好处是原型是JSON对象。而已。如果你了解JSON,你就能理解它是多么强大。阅读Crockford的网站,如果你想要这种类型的功能,你可以开始看看如何制作getter和setter,但这真的,取决于你正在谈论的阵营,“正确”的javascript代码编写方式。从技术上讲,这比使用OOP样式更快/更高效,因为所有对象都引用全局CalendarObject,而不是每次都创建一个新对象。
那只是我的两分钱。
答案 1 :(得分:0)
查看this answer类似的问题。
另外,请从MDN查看Details of the object model。
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