在Javascript中将另一个方法作为属性添加到函数时会发生什么?

时间:2012-04-04 17:10:39

标签: javascript

我同意函数是JS中的对象。当使用Function作为构造函数时,我们可以通过将这些属性添加到函数的prototype属性来向对象create添加属性。这就是我试过的:

var Mammal = function(name) {
    this.name = name;
};

var Cat = function(name) {
    this.saying = 'meow';
};

Cat.prototype = new Mammal();

Cat.prototype.display = function() {
    console.log('I display Cats');
};

//This is what I find hard to digest
Cat.display = function() {
    console.log('I display cats but at the top level');
};

我发现很难掌握的是评论部分。我只是想描绘出去哪里以及我不理解的这个特殊部分。我的意思是,如果我必须编写一个函数并在定义函数时执行类似的操作,那么语法是什么样的? 如果我尝试以下内容:

function demo() {
    this.saying = function() {
        console.log('I display cats but at the top level');
    };
};

此处的变量this指的是DOMWindow。如何在函数定义中实现上述功能。

我是JS的新手。对于我的任何无知,我道歉。

3 个答案:

答案 0 :(得分:1)

问题不是很清楚......

但是,请考虑以下代码:

function Test(title) { // object constructor (class)
    this.title = title;
}

Test.prototype.getTitle = function () { return this.title }; // shared (inherited) getter method
Test.version = 1; // static property (no need to instantiate an object)

var obj = new Test('hello, world!'); // an instance of the 'Test' class
console.log(obj.constructor.version); // reference to a static property of the class

当函数与 new 关键字一起调用时,它是一个构造函数, this 指向正在构造的对象({{1 }})。

当函数作为对象方法调用时(例如new Test('hello, world!')), obj.getTitle() 指向该对象。

正常调用函数(this)时, Test('hello, world!') 指向全局对象(窗口)。

这有帮助吗? :)

答案 1 :(得分:1)

这些类似于基于类的对象中的静态方法。也就是说,该方法只能从构造函数访问,而不能从实例本身访问。

这是“jQuery.get()你不能做的一个很好的例子

$('.someclass').get(myUrl);

你必须使用

$.get(myUrl);

但是,如果确实需要从实例访问静态方法,则有两个选项

var cat = new Cat('catName');
cat.constructor.display();
Cat.display();

http://jsfiddle.net/c39bW/

并不是说你的Cat的构造函数属性被破坏了,当你设置继承时,你应该修复Cat.prototype.constructor以指回Cat,请参阅上面的jsFiddle。另外,你没有从Cat的构造函数中调用基础构造函数(Mammal)。有关继承最低要求的教程,请参阅http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html

关于静态属性何时有用的一个很好的例子是,当一个对象需要跟踪它实例化的次数时,你不能在实例级别这样做;

function Tracker() {
   this.constructor.count++;
}

Tracker.count = 0;

Tracker.getCount = function() {
     return Tracker.count;
}

答案 2 :(得分:0)

为清楚起见,我已将您的Cat类更改为Animal。

添加到Animal原型的任何内容都将应用于Animal的任何新实例。调用时,关键字this将引用实例。

var cat = new Animal();
cat.display(); // calls Animal.prototype.display(), 'this' points to 'cat'

直接附加到Animal的任何内容都不会,并且只能直接访问:

Animal.display(); // 'this' points to 'Animal'