【问题标题】:Basic Object Structure and Calling for JavaScript [duplicate]JavaScript的基本对象结构和调用[重复]
【发布时间】:2013-08-26 01:40:13
【问题描述】:

我正在尝试做一些非常简单的事情。也就是说,使用我可以从其他地方调用的函数创建一个对象。我肯定错过了什么。我现在正在尝试的代码是:

function Object1() {
    function function1() {
        alert("hello");
    }
}


Object1.function1();

【问题讨论】:

  • 看看我给你的答案,它实际上是从 TypeScript 编译而来的。如果您想使用面向对象编程,那么我建议您使用 Typescript,因为它可以帮助您解决大部分麻烦。

标签: javascript


【解决方案1】:

内部函数只是在父函数范围内实现的函数。它不是整个对象的成员。

通常你会这样做:

function Object1() {
}

Object1.prototype = {
    function1: function () { 
         alert("hello");
    }
};

var obj = new Object1();
obj.function1();

需要注意的是,这是使用构造函数Object1的原型,因此这种方法将允许对象继承:

var Object2 = Object.create({ function2: function() { } }, Object1.prototype);

在 Mozilla 开发者网络 (MDN) 上了解有关面向对象的基于原型的编程的更多信息:

【讨论】:

  • Function1 应该是小写的。另外,你不支持我的近距离投票吗?
  • @JanDvorak 我只是将他自己的代码重新编写到正确的代码中..
  • @JanDvorak 在我的路上...你是对的 ;)
【解决方案2】:

我想你会喜欢的

var Object1 = function(name) {
  this.name = name;
};

Object1.prototype.function1 = function(prefix) {
  console.log(prefix + " " + this.name);
};


var obj = new Object1("naomi");
obj.function1("hello");
//=> "hello naomi"

私有数据成员的附加演示

Object1.prototype.otherFunction = function() {

  // private variable
  var count = 0;

  // private function
  var incrementCounter = function() {
    count += 1;
  };

  return incrementCounter();
};

obj.otherFunction(); //=> 1
obj.otherFunction(); //=> 2
obj.otherFunction(); //=> 3

只是为了好玩,这里也有一个子类!

var Object2 = function(name, numberOfCats) {

  // call parent constructor
  Object1.call(this, name);

  this.numberOfCats = numberOfCats;
};

// setup prototype chain
Object2.prototype = Object.create(Object1.prototype, {constructor: {value: Object2}});

// an object2 public instance method
Object2.prototype.sayHello = function() {
  console.log(this.name + " has " + this.numberOfCats + " cats");
};

用法如你所愿

var obj2 = new Object2("naomi", 3);
obj2.sayHello()
//=> "naomi has 3 cats"

我们从 Object1 中的方法也被继承了

obj2.function1("hi my name is");
//=> "hi my name is naomi"

还有私人的

obj2.otherFunction(); //=> 1
obj2.otherFunction(); //=> 2

【讨论】:

  • 这不是我的确切答案,是吗? :D
  • @MatíasFidemraizer 它非常接近 :-) 但我会给予怀疑的好处,而不是因为窃取可以通过没有注意到来解释的东西而投反对票。
  • @MatíasFidemraizer,不。您正在为 Object1 定义使用命名函数,并为原型使用对象文字。不是我的风格,当然也不是我的推荐。
  • @naomik 我不知道该选择哪种风格...但是如果您分配一个全新的原型,请务必正确设置构造函数。
  • @JanDvorak 你能详细说明一下吗?
【解决方案3】:

这个函数是“私有的”。

要使其可公开访问,您需要执行以下操作:

function Object1() 
{
    this.Function1 = function() 
    {
        alert("hello");
    }
}

var thingy = new Object1();
thingy.Function1();

同样,要创建私有变量,您可以使用:

function Object1()
{
    var myPrivateVariable = 'something';
}

虽然公共变量是:

function Object1()
{
    this.myPublicVariable = 'something';
}

尽量避免将一堆变量声明为全局变量,当您忘记直接声明它们时会意外发生:

function Object1()
{
    globalVariable = 'oops';
}

JavaScript 处理 OOP 与大多数其他语言有很大不同,尤其是在原型设计和闭包方面。

THIS 是一个不错的基础链接,但我也推荐经典的“JavaScript: The Good Parts”。

【讨论】:

  • 第一个例子不适合我。 jsfiddle.net/RyvCn
  • 我的错……我很马虎。我只是编辑了他的原始代码以公开该功能;但你们都是正确的......对象需要先实例化才能使用。
  • 编辑帖子以使其更清晰。
【解决方案4】:

我相信这是实现您想要的最佳方式。

var Thing = (function () {
    function Thing(varOne) {
        this.varOne = varOne;
    }
    Thing.prototype.saySomething = function () {
        console.log(this.varOne);
    };
    return Thing;
})();

var app = new Thing("Cheese");
app.saySomething();

如果你想在 JavaScript 中使用对象和类,我可以冒昧地推荐 TypeScript 吗?它可以编译成普通的旧 javascript,并且可以与您现有的 javascript 代码一起使用。

现在有些人可能会认为这是一个激进的变化。它真的不是。它只是带有类的 JavaScript,并且由于它是 Javascript 的超集,它可以使事情变得无限容易。此外,当 ECMAScript 6 发布时,Typescript 成为功能齐全的 javascript,所以为什么不使用今天即将发布的功能,当它发布时,您只需更改 typescript 的类型扩展到 javascript。如果您只是想看看它是如何工作的,请看here

演示:

这是来自 nodejs 控制台。

> var Thing = (function () {
...     function Thing(varOne) {
.....         this.varOne = varOne;
.....     }
...     Thing.prototype.saySomething = function () {
.....         console.log(this.varOne);
.....     };
...     return Thing;
... })();
undefined
> var app = new Thing("Cheese Cake");
undefined
> app.saySomething();
Cheese Cake
undefined
>

我使用 Typescript 生成了上面的 js 代码,这是 Typescript 的样子:

class Thing {
    constructor( public varOne: string) {}

    saySomething (): void {
        console.log(this.varOne);
    }
}

var app = new Thing("Cheese");
app.saySomething();

如您所见,语法更加简洁。你可以去 Typescript 的官网了解更多。

【讨论】:

  • 很好,但为什么不内联 IIFE?没有要包含的范围。
  • @JanDvorak:刚刚改了代码。
  • 不错,但我仍然不认为需要 IIFE
  • 另外,如果你要推荐一种全新的语言,也许你至少应该说为什么用户应该做出如此彻底的改变(即使有效的javascript是大部分有效的打字稿)
  • @JanDvorak:为什么,我违反了什么规则?
【解决方案5】:

你可以这样做:

Class1 = function () {
    this.Function1 = function() {
        alert("hello");
    }
}

var Object1 = new Class1()
Object1.Function1();

【讨论】:

  • Function1 应为小写。另外,你不支持我的近距离投票吗?
【解决方案6】:

我想这就是你想要的。

var Object1 = {
    Function1: function() {
        alert("hello");
    }
}

Object1.Function1();

【讨论】:

  • Function1 应为小写。另外,你不支持我的近距离投票吗?
  • @JanDvorak 我已经有了。现在投票数是 2 :)
  • 谢谢 :-) 我上次刷新时是 1
【解决方案7】:

正如您所说,您要在该对象中创建一个对象和一个函数,这就是应该这样做的:-

var myFunc = function() {   
    alert("Hello");
}

var myObj  = {"func":myFunc};

现在您可以使用:- myFunc.func();

【讨论】:

  • 这不是非常面向对象的,但是
  • 我认为那个“应该”应该消失。
猜你喜欢
  • 2014-10-08
  • 1970-01-01
  • 2019-04-21
  • 2019-04-27
  • 2020-04-11
  • 2012-09-21
  • 2017-06-24
  • 1970-01-01
  • 2012-10-10
相关资源
最近更新 更多