做Javascript“类”(OOP)的可接受/好方法?

时间:2013-12-30 00:15:01

标签: javascript oop object

我很长时间以来一直想知道如何正确地使用Javascript,而且我已经读过它但从未真正尝试过任何事情。我选择使用Object.create方法。与Object.create的con是没有构造函数,这是我有点像。所以我提出了我自己的"包括它的方式。

我的问题很简单 - 这是一个做Javascript OOP的好方法吗?

http://pastebin.com/AkG0KpAR

修改:已更新Object.init

edit2:删除了内联代码并添加了pastebin链接

2 个答案:

答案 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