javascript -

  显示原文与译文双语对照的内容

我最近发现Javascript函数可以有类,所以我想知道OOP是否也可以通过Javascript实现。 是如果是的话,请指出一些教程或者网站,我可以从这里开始?

时间:

OOP无疑是可能的,虽然Javascript没有像大多数面向对象语言那样做的"类",但是它所做的事情称为"Prototype"。 基本上,对象是按照其他对象而不是类定义的。 ( 对象还可以在某种程度上模拟类,对于那些不能围绕Prototype继承的人来说,这些类

一个可以争论的是js功能的面向对象的,因为考虑到对象扮演的角色比使用类的语言更重要。

OOP是Javascript的核心,但它不是经典的OOP 。 Javascript使用 Prototype,而不是类。

Douglas Crockford是一个Javascript天才,因此他在 Javascript 中的 Prototype继承是一个不错的起点。 谷歌搜索 "javascript OOP"可能会出现一些简洁的文章阅读,以及—我喜欢迈克 Koss 本文

Javascript是一种面向方面的语言。 就像其他人说的,它是无classless的,但是你可以选择如何创建对象。

可以创建使用不同类型继承的对象。

  1. pseudo-classical继承在这里你可以构建构造函数函数并使用 new 来创建类。 这看起来很像典型的基于类的OOP 。
  2. Prototype继承。- 这是许多其他答案所引用的。
  3. 功能继承。在这种模式中,你使用闭包。匿名函数和策略返回来创建真正私有的和受保护的变量。

在这些类型之间有相当数量的交叉。 可以说Javascript是一种非常灵活和强大的面向对象语言。

我只是在JS中学习 OOP 。 下面是我放在一起的功能继承示例:

jsFiddle


//Object constructor
var parent = function (initial) {
 var that, privateNumber, hiddenVar; 
 that = {}; 

//Public variables
 that.share = initial - 32;

//Public methods
 that.getNumber = function () {
 return privateNumber; 
 };

//Private properties
 privateNumber = initial; 
 hiddenVar ="haha can't get me"; 

 return that;
};

//Second object constructor that inherits from parent
var child = function (initial) {
 var that, privateName;

//Inherit from parent
 that = parent(initial);

//Public methods
 that.getName = function () {
 return privateName; 
 };

//Private poroperties
 privateName ="Ludwig the" + initial +"th";

 return that;
};

//Create objects
var newPar1 = parent(42);
var newPar2 = parent(10); 

var newChild1 = child(0);
var newChild2 = child(100);

//Output on the jsFiddle page refed 上面: http://jsfiddle.net/ghMA6/

是的。有可能。我曾经使用过Script#来构建JavaScript应用程序,它允许你编写 C# 代码,并转换为 JavaScript 。 它是一个很好的经验,特别是对于大型项目,它将迫使你在OOP的方式中。

工具可以在以下位置找到: ( 它是开源的,但由微软员工) http://scriptsharp.com

如果你不熟悉 C#,你也可以在Java中找到编写javascript的类似工具。

如果你不希望使用这些功能,你可以研究它如何转换代码来了解它如何实现OOP特性。

下面是一个在javascript中实现面向对象结构的示例,它使用了一个库( 不需要


//Create and define Global NameSpace Object
( function(GlobalObject, $, undefined) 
{
 GlobalObject.PublicMethod = function()
 {
///<summary></summary>
 }

 GlobalObject.Functionality = {}

}) (GlobalObject = GlobalObject || {}, jQuery);

//New object for specific functionality
( function(Events, $, undefined)
{
//Member Variables 
 var Variable;//(Used for), (type)

//Initialize
 Events.Init = function()
 {
///<summary></summary>
 }

//public method
 Events.PublicMethod = function(oParam) 
 {
///<summary></summary>
///<param type=""></param>
 }

//protected method (typically define in global object, but can be made available from here)
 GlobalObject.Functionality.ProtectedMethod = function()
 {
///<summary></summary>
 }

//internal method (typically define in global object, but can be made available from here)
 GlobalObject.InternalMethod = function()
 {
///<summary></summary>
 }

//private method
 var privateMethod = function()
 {
///<summary></summary>
 }

 Events.PublicProperty ="Howdy Universe";
}) (GlobalObject.Functionality.Events = GlobalObject.Funcitonality.Events || {}, jQuery )

//Reusable"class" object
var oMultiInstanceClass = function()
{
//Memeber Variables again
 var oMember = null;//

//Public method
 this.Init = function(oParam)
 {
 oMember = oParam;
 }
}

这个强度是指它自动初始化全局对象,允许你保持代码的完整性,并将每个功能的每一部分组织成一个特定的分组。

这个结构是实心的,你可以在没有关键词的情况下给出你期望的所有基本语法。

甚至还有一些巧妙的方法来设置接口。 如果你选择这么做的话,简单的搜索将给你一些好的教程和技巧。

甚至可以使用javascript和 Visual Studio 设置智能感知,然后定义每个Fragment并引用它们使得编写javascript更加简洁,更易于管理。

根据你的情况使用这三种方法有助于保持全局命名空间整洁,保持代码的组织,并为每个对象维护关注点分离。 如果正确使用,请记住,如果你不使用使用对象背后的逻辑,面向对象的设计就没用了 !

...