我同意函数是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的新手。对于我的任何无知,我道歉。
答案 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();
并不是说你的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'