将函数添加为包含此值的属性

时间:2014-10-07 20:25:14

标签: javascript

我在向对象添加包含this的函数时遇到问题。它产生了我没想到的结果,这让我有些困惑。我尝试使用Object.create()重写代码并且只是抛出一个错误。我肯定会忽略一些简单的事情。如何确保qaz.execute隐式绑定到qaz?谢谢你的帮助。

// Version 1:
var qaz = {}; // [[Prototype]] will point to Object.prototype.
qaz.execute = function(){ console.log( "qaz: " + this ) };
qaz.execute(); // qaz: [object Object] (Why not qaz or even global/undefined?)

// Version 2:
var qaz = Object.create(null); // [[Prototype]] will be null.
qaz.execute = function(){ console.log( "qaz: " + this ) };
qaz.execute(); // TypeError: can't convert this to primitive type (Why?)

2 个答案:

答案 0 :(得分:0)

很难准确说出你想要完成的事情。我建议您查看https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this#this_on_the_object' s_prototype_chain

它应该让你更好地掌握this

我可以说,如果你想记录qaz究竟是什么,那就试试吧

var qaz = {}; 
qaz.execute = function(){ return this };
console.log("qaz: " + qaz.execute());
但是,它不打印" qaz",但我认为它会打印所有qaz的属性。 如果您想了解有关将内容输出到控制台的更多信息,请阅读此处 https://developer.mozilla.org/en-US/docs/Web/API/console#Outputting_text_to_the_console

答案 1 :(得分:0)

// Version 2:
var qaz = Object.create(null); // [[Prototype]] will be null.
qaz.execute = function(){ console.log( "qaz: " + this ) };
qaz.execute(); // TypeError: can't convert this to primitive type (Why?)

因为quz不从Object.prototype继承toString。您可以执行以下操作:

var qaz = Object.create(null); // [[Prototype]] will be null.
qaz.execute = function(){ console.log( "qaz: " + 
Object.prototype.toString(this) ); };
qaz.execute();

或者如我和elclanrs的评论所述;根本不将对象转换为字符串并按原样记录对象(可能在IE中不起作用):

var qaz = Object.create(null); // [[Prototype]] will be null.
qaz.execute = function(){ console.log( "qaz: ", this); };
qaz.execute();