Javascript对象的属性和功能

时间:2012-07-19 17:04:58

标签: javascript oop object

在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';
    }




}

4 个答案:

答案 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语法。

希望能稍微清理一下!