javascript对象问题

时间:2010-08-24 22:40:02

标签: javascript oop

我来自c#面向对象的背景,并且在javascript中使用类似的原理。我的任何好文章可以帮助我研究吗?

这是我为Product Javascript对象组合的示例:

function Product() {
    this.reset = function () {
        this.id = 0;
        this.name = '';
    }
}

Product.prototype = {
    loadFromJson: function (json) {
        this.reset();
        this.id = json.Id;
        this.name = json.Name;
    },

checkAvailability: function (qty) {
    // Just to illustrate
    return true;
}
};

所以要创建Product的实例:

var p = new Product();

访问公共方法:

var isAvailable = p.checkAvailability(1);

访问公共财产:

var name = p.name;

复位功能我是否创建了一个有效的私有函数?

我上面所做的是正确的还是有更好的方法?我是新手!

另外,如果我在另一个javascript文件中创建产品实例,我可以对Product对象的属性进行智能化吗?

3 个答案:

答案 0 :(得分:1)

重置为this.reset();,因此它位于对象的范围内,因此可以称为public,但仍保留在该范围内。在您的示例中p.reset();reset();失败。

更好的方法?这取决于某些情况需要这种复杂,有些情况则不然。有很多方法可以实例化对象(一切都是JavaScript中的对象),你的例子就是一些方法。

除非你建立并附属自己(很多工作),否则不会有任何好处。 (搜索jQuery intellisence以了解如何完成)

有关命名空间的更多信息,请参阅此内容。注意内部和公共函数和变量。

var myStuffApp = new function()
{
    var internalFunction = function()
    {
        alert('soy una función interna');
    };
    this.publicFunction = function()
    {
        alert('soy una función pública');
    };
    var test1 = 'testing 1';//private/internal
    this.test2 = 'testing 2';// namespaced
    testA="ho";// global
};

答案 1 :(得分:1)

我建议您阅读此msdn page以获取基本信息。这就像面向c#的开发人员的速成课程。

答案 2 :(得分:1)

  

复位功能我是否创建了一个有效的私有函数?

没有。它与prototype上设置的功能不同,因为reset的每个实例都会获得Product的不同副本:

var p1= new Product();
var p2= new Product();
alert(p1.loadFromJson===p2.loadFromJson); // true
alert(p1.reset===p2.reset); // false

但它不是私密的。你仍然可以这样做:

var p= new Product();
p.reset();

虽然可以使用闭包在JavaScript中执行私有函数,但它几乎不值得。考虑使用Python惯例命名所有不希望在实现之外使用的成员使用前面的下划线。

有关JS对象模型的详细讨论,请参阅this question