3

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

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 的新手。对于我的任何无知,我深表歉意。

4

3 回答 3

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;
}
于 2012-04-04T17:44:11.423 回答
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指向正在构造的对象(new Test('hello, world!'))。

当函数作为对象方法调用时(例如,obj.getTitle()),this指向该对象。

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

这有帮助吗?:)

于 2012-04-04T17:40:18.943 回答
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'
于 2012-04-04T17:38:06.687 回答