我应该将对象属性传递给对象方法吗?

时间:2014-12-15 15:03:37

标签: javascript

我正在尝试学习面向对象的JavaScript。使用一种简单的方法我想这样做:

var users = function(url){
    this.url = url;
    this.log = function(){
        console.log(this.url);
    }
}
var apiPoint = "https://www.zenconomy.se/api/admin/tracking?format=json"
var liveUsers = new users(apiPoint)
liveUsers.log()

但是,我已经了解到在使用普通函数时将变量传递给函数通常是一个好主意,但是在对象中,这看起来有点笨拙。

var users = function(url){
    this.url = url;
    this.log = function(url){
        console.log(url);
    }
}
var apiPoint = "here is my url"
var liveUsers = new users(apiPoint)
liveUsers.log(liveUsers.url)

两种方法都有效。假设users.log只需要来自用户类的属性,那么不同方法的优点和缺点是什么。

2 个答案:

答案 0 :(得分:1)

你刚才提到过你正试图在javascript中学习OOP,但实际上,如果没有用户实例,没有user方法,请考虑log对象中的日志功能。根据C ++或C#中的OO,这不是相同的概念。在我看来,prototype将最好地描述oop,做如下:

var users = function(url){
    this.url = url;
}
users.prototype.log = function(){
    console.log(this.url);
}

通过这种方式,log将不会出现在users的任何实例中,它存在于__proto__中,在任何情况下都是prototype的引用。这意味着当您创建实例时,它们共享所有功能,与C ++或C#相同。最后,你不应该在你的帖子中使用第二个样本,那不是OO的东西。

答案 1 :(得分:0)

如果您希望log始终打印对象的URL,那么您当然不会将对象的URL作为参数传递,因为log可以自行获取它。

如果您想记录对象的各种属性,我建议为个别情况制作单独的例程,例如logUrllogBlah

如果您希望log打印一些任意值,则不用说您需要传入值。

如果没有关于与对象相关的日志记录,那么您可以只使用一个独立于记录任何传递对象的对象的日志记录例程。