Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“可接受/良好的Javascript操作方式”;“类”;(哎呀)?_Javascript_Oop_Object - Fatal编程技术网

“可接受/良好的Javascript操作方式”;“类”;(哎呀)?

“可接受/良好的Javascript操作方式”;“类”;(哎呀)?,javascript,oop,object,Javascript,Oop,Object,很长一段时间以来,我一直在想如何正确地使用Javascript,我读过相关文章,但自己从未真正尝试过任何东西。我选择使用Object.create方法。Object.create的缺点是没有构造函数,这是我比较喜欢的。所以我想出了我自己的方法 我的问题很简单——这是一种很好的Javascript OOP方法吗 编辑:更新了Object.init edit2:删除内联代码并添加pastebin链接我将首先回答您的问题,说明我将如何实现您的目标,然后向您介绍我将如何以不同的方式实现它 您的方式当然

很长一段时间以来,我一直在想如何正确地使用Javascript,我读过相关文章,但自己从未真正尝试过任何东西。我选择使用
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