我注意到,似乎没有明确解释this关键字是什么以及如何在Stack Overflow站点上的JavaScript中正确(和错误地)使用它.
我亲眼目睹了一些非常奇怪的行为,并且无法理解为什么会发生这种行为.
this工作如何以及何时使用?
我想知道使用这些中的任何一个是否有任何优势,我应该走哪条路?
构造方法:
var Class = function () {
this.calc = function (a, b) {
return a + b;
};
};
Run Code Online (Sandbox Code Playgroud)
原型方法:
var Class = function () {};
Class.prototype.calc = function (a, b) {
return a + b;
};
Run Code Online (Sandbox Code Playgroud)
我不喜欢这样,使用原型,方法定义与类分开,我不知道是否有任何特定的原因我应该使用它而不是第一种方法.
此外,使用函数文字定义"类"是否有任何好处,而不仅仅是函数定义:
var Class = function () {};
Run Code Online (Sandbox Code Playgroud)
VS
function Class () {};
Run Code Online (Sandbox Code Playgroud)
谢谢!
据说Javascript的一个主要优点是它是一种基于原型的语言.
但是,Javascript基于原型是什么意思,为什么这是一个优势呢?
可能重复:
了解JavaScript中的原型继承
好的,所以我对JS中的OOP概念有些新意.
这两个代码片段之间有什么区别:
function animal(){
this.name = 'rover';
this.set_name = function(name){
this.name = name;
}
}
Run Code Online (Sandbox Code Playgroud)
function animal(){
this.name = 'rover';
}
animal.prototype.set_name = function(name){
this.name = name;
}
Run Code Online (Sandbox Code Playgroud)
他们都做同样的事情,那有什么区别?
在创建javascript对象时,我可以在构造函数或原型中放置方法声明.例如,假设我想要一个具有Name属性和Bark方法的Dog类.我可以将Bark方法的声明放入构造函数中:
var Dog = function(name) {
this.Name = name;
this.Bark = function() {
alert(this.Name + " bark");
};
}
Run Code Online (Sandbox Code Playgroud)
或者我可以作为原型对象的方法:
var Dog = function(name) {
this.Name = name;
}
Dog.prototype.Bark = function() {
alert(this.Name + " bark");
};
Run Code Online (Sandbox Code Playgroud)
当我实例化Dog类型的对象时,两种方法似乎都正常工作:
var dog = new Dog("Fido");
dog.Bark(); //Both approaches show "Fido bark"
Run Code Online (Sandbox Code Playgroud)
我应该更喜欢这些方法中的一种吗?使用一个优于另一个是否有任何优势?在幕后,这两种方法最终做了完全相同的事情吗?大多数人倾向于采用哪种方法?
谢谢您的帮助.
在JavaScript中,我们有两种方法可以创建"类"并赋予它公共功能.
方法1:
function MyClass() {
var privateInstanceVariable = 'foo';
this.myFunc = function() { alert(privateInstanceVariable ); }
}
Run Code Online (Sandbox Code Playgroud)
方法2:
function MyClass() { }
MyClass.prototype.myFunc = function() {
alert("I can't use private instance variables. :(");
}
Run Code Online (Sandbox Code Playgroud)
我读了很多次,人们说使用方法2效率更高,因为所有实例共享相同的函数副本而不是每个实例都有自己的副本.通过原型定义函数有一个巨大的缺点 - 它使得无法拥有私有实例变量.
即使理论上,使用方法1给对象的每个实例赋予它自己的函数副本(因此使用更多的内存,更不用说分配所需的时间) - 实际上实际发生了什么?似乎优化Web浏览器可以很容易地识别这种非常常见的模式,并且实际上让对象的所有实例引用通过这些"构造函数"定义的相同函数副本.然后,如果稍后显式更改,它只能为实例提供自己的函数副本.
关于两者之间的性能差异的任何见解 - 或甚至更好的现实世界经验 - 都将非常有帮助.
您能否请您推荐以下哪项是最佳的或其优缺点?
function User() {
this.name = "my name";
this.save = function() {
};
}
Run Code Online (Sandbox Code Playgroud)
function User() {
this.name = "my name";
}
User.prototype.save = function() {
}
Run Code Online (Sandbox Code Playgroud) 我对各种JavaScript函数的理解如下:
function MyObj() {
this.propOne = true;
this.publicInstanceFunc = function() {
if (propOne)
return 'public instance function';
}
function privateFunc() {
return 'private function only visible inside this constructor';
}
}
MyObj.prototype.protoFunc = function() {
if (this.propOne)
return 'prototype function shared amongst all instances of MyObj';
}
Run Code Online (Sandbox Code Playgroud)
protoFunc)和构造函数(例如publicInstanceFunc)中?this正确的方法访问原型函数内的属性?在JavaScript中,"this"运算符可以在不同的场景下引用不同的东西.
通常在JavaScript"对象"内的方法中,它引用当前对象.
但是当用作回调时,它将成为对调用对象的引用.
我发现这会导致代码出现问题,因为如果你在JavaScript"对象"中使用一个方法作为回调函数,你无法判断"this"是指当前的"对象"还是"this"是指调用对象.
有人可以澄清如何解决这个问题的用法和最佳实践吗?
function TestObject() {
TestObject.prototype.firstMethod = function(){
this.callback();
YAHOO.util.Connect.asyncRequest(method, uri, callBack);
}
TestObject.prototype.callBack = function(o){
// do something with "this"
//when method is called directly, "this" resolves to the current object
//when invoked by the asyncRequest callback, "this" is not the current object
//what design patterns can make this consistent?
this.secondMethod();
}
TestObject.prototype.secondMethod = function() {
alert('test');
}
}
Run Code Online (Sandbox Code Playgroud) 我是一个小型研究小组的成员,正在努力更好地掌握JavaScript的作用.在我们最近关于对象的讨论中,我们已经了解到每次实例化对象时都会重新创建对象的公共方法,而分配给对象原型的方法只创建一次并由所有实例继承.根据我的理解,公共方法和分配给原型的方法都是公开访问的.
那么,我的问题是,如果添加到原型显然更有效,为什么还要创建公共方法呢?公共方法提供的原型没有什么好处?