在JavaScript中我看到了几种不同的方式,某些任务可以在一个对象中执行,例如,我在下面的对象Egg。
任何人都可以告诉我每一个之间的区别,为什么我会使用一个而不是另一个等等
var Egg = function(){
//Properties
var shell = "cracked" // private property
this.shell = "cracked" // public property
shell: "cracked" // what is this??
//functions
function cook(){
//standard function
}
cook: function(){
//what kind of function is this?
}
//not sure what this is
details: {
//What is this? an array :S it holds 2 elements?
cost: 1.23,
make: 'Happy Egg';
}
}
答案 0 :(得分:5)
您的代码段不是很有效,但以下是它引发的一些事情:
你问过shell: cracked
是什么。它是属性初始值设定项。你可以在object initializers(又名“对象文字”)中找到它们,它们是这样写的:
var obj = {
propName: "propValue"
};
这相当于:
var obj = {};
obj.propName = "propValue";
以上两者都使用名为propName
的属性创建一个对象,该属性具有字符串值"propValue"
。请注意,this
没有进入。
有几个地方的功能通常会与对象相关:
有构造函数,它们是您通过new
operator调用的函数。这是一个例子:
// Constructor function
function Foo(name) {
this.name = name;
}
// Usage
var f = new Foo("Fred");
请注意在那里使用关键字this
。那是你见过的(最有可能的)。当您通过new
调用构造函数时,this
引用new
运算符创建的新对象。
this
在JavaScript中是一个很滑的概念(与C ++,Java或C#中的this
完全不同),我推荐这两个(咳嗽)帖子博客:
您不必使用构造函数和new
,而另一种模式使用“builder”或“factory”函数代替:
// A factory function
function fooFactory(name) {
var rv = {}; // A new, blank object
rv.name = name;
return rv;
}
// Usage
var f = fooFactory("Fred");
您在提问中提到了“私人”属性。 JavaScript根本没有私有属性(但是,它们正在路上)。但是你看到人们模拟它们,通过在执行上下文中定义它们在对象上使用的函数作为闭包(通常是对构造函数或工厂函数的调用),其中包含其他人无法看到的变量,像这样:
// Constructor function
function EverUpwards() {
var counter = 0;
this.increment = function() {
return ++counter;
};
}
// Usage:
var e = new EverUpwards();
console.log(e.increment()); // "1"
console.log(e.increment()); // "2"
(该示例使用构造函数,但您可以使用工厂函数执行相同的操作。)
请注意,即使我们分配给increment
的功能可以访问counter
,也没有别的可以。所以counter
实际上是私有财产。这是因为函数是一个闭包。更多:Closures are not complicated
答案 1 :(得分:3)
当然,Ben。
这种情况触及了JavaScript的活力底线。 首先,我们将看一下基础知识 - 如果你来自一个理解基于类的语言的地方,比如Java或C ++ / C#,那么最有意义的就是构造函数模式很早就包括在内:
function Egg (type, radius, height, weight) {
// private properties (can also have private functions)
var cost = (type === "ostrich") ? 2.05 * weight : 0.35 * weight;
// public properties
this.type = type;
this.radius = radius;
this.height = height;
this.weight = weight;
this.cracked = false;
// this is a public function which has access to private variables of the instance
this.getCost = function () { return cost; };
}
// this is a method which ALL eggs inherit, which can manipulate "this" properly
// but it has ***NO*** access to private properties of the instance
Egg.prototype.Crack = function () { this.cracked = true; };
var myEgg = new Egg("chicken", 2, 3, 500);
myEgg.cost; // undefined
myEgg.Crack();
myEgg.cracked; // true
这很好,但有时候有更简单的方法来解决问题。 有时你真的不需要上课。
如果你只想使用一个鸡蛋,那该怎么办?因为那是你要求的所有食谱吗?
var myEgg = {}; // equals a new object
myEgg.type = "ostrich";
myEgg.cost = "......";
myEgg.Crack = function () { this.cracked = true; };
那很好,但那里仍有很多重复。
var myEgg = {
type : "ostrich",
cost : "......",
Crack : function () { this.cracked = true; }
};
两个“myEgg”对象都完全相同。
这里的问题是myEgg的每个属性和每个方法都是100%公开给任何人。
解决方法是立即调用函数:
// have a quick look at the bottom of the function, and see that it calls itself
// with parens "()" as soon as it's defined
var myEgg = (function () {
// we now have private properties again!
var cost, type, weight, cracked, Crack, //.......
// this will be returned to the outside var, "myEgg", as the PUBLIC interface
myReturnObject = {
type : type,
weight : weight,
Crack : Crack, // added benefit -- "cracked" is now private and tamper-proof
// this is how JS can handle virtual-wallets, for example
// just don't actually build a financial-institution around client-side code...
GetSaleValue : function () { return (cracked) ? 0 : cost; }
};
return myReturnObject;
}());
myEgg.GetSaleValue(); // returns the value of private "cost"
myEgg.Crack();
myEgg.cracked // undefined ("cracked" is locked away as private)
myEgg.GetSaleValue(); // returns 0, because "cracked" is true
希望这是一个不错的开始。
答案 2 :(得分:1)
您正在混合对象属性声明和简单的javascript语句之间的语法。
// declare an object named someObject with one property
var someObject = {
key: value
};
// declare an anonymous function with some statements in it
// and assign that to a variable named "someFunction"
var someFunction = function () {
// any javascript statements or expressions can go here
};
答案 3 :(得分:0)
JavaScript在对象和函数之间存在一个关键区别。对象包含一堆数据(包括函数),函数可用于制作或修改对象,但它们本身并不相同。 JavaScript中的OOP基于将函数用作类。例如,参加以下课程:
Test = function(){
this.value = 5;
}
如果你只是调用函数Test()
,那么什么都不会发生。即使您说var x = Test()
,x的值也会为undefined
。但是,使用new
关键字,魔术就会发生!因此,如果我们说var x = new Test()
,那么现在变量x
将包含一个Test对象。如果您执行console.log(x.value)
,则会打印5。
这就是我们如何使用函数来创建对象。语法上也有一个关键的不同 - 一个函数可以包含你想要的任何类型的JavaScript块,无论是if语句还是for循环或者你有什么。但是,在声明对象时,必须使用key: value
语法。
希望能稍微清理一下!