我有这段代码:
function Person(name){
var self = this;
this.name = name;
function hello(){
alert("hello " + self.name);
}
return {
hello: hello
};
}
var newPerson = new Person("john");
newPerson.hello();
我希望能够使用'this'关键字来访问'hello'函数中的'name'属性;我想要另一种方法来使用'self'变量。
除了使用jquery的$ .proxy函数来控制上下文之外,如何编写相同的代码但没有变量'self'?
我想要一个如下所示的代码,但当我调用'newPerson.hello()'时,'name'总是'undefined'。我不知道为什么,因为我一直认为函数的范围始终是调用者点左边的对象,在这种情况下,它是'newPerson',它在创建时赋值'john'对象。
function Person(name){
this.name = name;
function hello(){
alert("hello " + this.name);
}
return {
hello: hello
};
}
var newPerson = new Person("john");
newPerson.hello();
谢谢。
答案 0 :(得分:8)
您可以使用.bind
强制函数的所有者成为您传递的任何对象。因此,您可以像这样编写Person
对象:
function Person(name){
this.name = name;
var hello = function(){
alert("hello " + this.name);
}.bind(this);
return {
hello: hello
};
}
这将确保.hello
始终在调用它的Person
的上下文中执行。
这是一个演示:
答案 1 :(得分:5)
使用new
关键字时,默认情况下不使用return函数将返回this
你需要改变你的函数的声明方式。
这是一个小提琴
http://jsfiddle.net/SaintGerbil/9SAhD/
function Person(name){
this.name = name;
this.hello = function (){
alert("hello " + this.name);
}
}
var newPerson = new Person("john");
newPerson.hello();
编辑如果您要求名称为私有,则此处为替代
function Person(name){
var _name = name;
this.hello = function (){
alert("hello " + _name);
}
}
var newPerson = new Person("john");
newPerson.hello();
在回答您的问题时,有4种方法可以调用函数
这些会影响this
的价值
new
关键字),其中this
是自动返回的新对象。this
是从中调用的对象。this
成为全局对象,(调用没有new的contstructor时常见的错误)进一步编辑
所以在开始时采用你想要的代码并解释发生了什么。
function Person(name){
this.name = name; // 1
function hello(){ // 2
alert("hello " + this.name); // 3
}
return {
hello: hello
}; //4
}
作为函数的人可以通过两种方式调用
: var x = Person("ted");
和
var x = new Person("jimmy");
由于您已使用大写命名Person,这意味着您希望人们使用new
因此我们坚持使用,我们输入函数,javascript创建一个新对象并将其分配给this
。
this
并使用传递的参数进行初始化。 this
。this
(默认行为)我们现在声明一个新对象并将该函数附加到它。这个新对象的范围没有“name”变量。因此,当您创建对象时,您会获得一个附加了函数的对象,但它无法获取正确执行的变量。 这就是你得到未定义的原因。
这是否有意义当我不得不扩展文本框时,我总是担心我会胡扯?
或者,如果我尽可能详细地写出你的功能,那么看起来就像这样。
function Person(name){
var this = new Object();
this.name = name;
var hello = function (){
alert("hello " + this.name);
}
this.hello = hello;
var that = new Object();
that.hello = hello;
return that;
}
答案 2 :(得分:3)
你似乎混淆了两件事。
function CreatePerson(name) {
// create a new object
var person = {};
// or (if you want to provide a prototype)
var person = Object.create(...);
// fill it with some more data
person.name = name;
person.foo = 123;
person.bar = function() { /* ... your method body ... */ };
}
调用如:
var person = CreatePerson("Jack");
function Person(name) {
// called after a Person is created,
// `this` is bound to the new object
// and its prototype is set to `Person.prototype`
this.name = name;
this.foo = 123;
this.bar = function() { /* ... your method body ... */ };
}
var person = new Person("Jack");
请注意这里的特殊new
语法。
使用此样式时,您可能只想创建一次方法,而不是每个创建的实例:
function Person(name) {
// called after a Person is created,
// `this` is bound to the new object
// and its prototype is set to `Person.prototype`
this.name = name;
this.foo = 123;
}
Person.prototype.bar = function() {
/* ... your method body ... */
};
var person = new Person("Jack");
答案 3 :(得分:1)
这样做有用。
如果你只想在功能中访问它,你可以这样做。 你使用return {hello:hello}声明函数而你不需要做,除非你想要的是
示例1
function _persons(array) { this.available = array; this.write = function () { writedata(this.available, '#array2'); }; this.SortAge = function () { array.sort(compare); writedata(this.available, '#array3'); }; array.sort(compareName); } var users = new _persons(myarray);
示例2
function Person(name ){ this.name = name ; this.hello = function(){ alert("hello " + this.name); } } var a = "john"; var newPerson = new Person(a); newPerson.hello(); var otherPerson = new Person("annie"); otherPerson.hello();