我正在尝试做一些非常简单的事情。也就是说,创建一个具有我可以从其他地方调用的函数的对象。我肯定错过了什么。我现在正在尝试的代码是:
function Object1() {
function function1() {
alert("hello");
}
}
Object1.function1();
答案 0 :(得分:2)
内部函数只是在父元素范围内实现的函数。它不是整个对象的成员。
通常你这样做:
function Object1() {
}
Object1.prototype = {
function1: function () {
alert("hello");
}
};
var obj = new Object1();
obj.function1();
重要的是要注意这是使用构造函数Object1
的原型,因此这种方法将允许对象继承:
var Object2 = Object.create({ function2: function() { } }, Object1.prototype);
在Mozilla Developer Network(MDN)上查看有关面向对象原型的编程的更多信息:
答案 1 :(得分:2)
此功能将是私人'
要使其可公开访问,您需要执行以下操作:
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"同样。
答案 2 :(得分: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
答案 3 :(得分:2)
我相信这是达到你想要的最佳方式。
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,所以为什么不使用今天发布的功能,当它出现时,你可以只改变打字稿的类型扩展名到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的官方网站了解更多信息。
答案 4 :(得分:1)
你可以这样做:
Class1 = function () {
this.Function1 = function() {
alert("hello");
}
}
var Object1 = new Class1()
Object1.Function1();
答案 5 :(得分:0)
我认为这就是你想要的。
var Object1 = {
Function1: function() {
alert("hello");
}
}
Object1.Function1();
答案 6 :(得分:0)
正如您所说,您想在该对象中创建一个对象和一个函数,这就是它应该如何完成的: -
var myFunc = function() {
alert("Hello");
}
var myObj = {"func":myFunc};
现在您可以使用: - myFunc.func();