这在javascript中没有按预期填充数据

时间:2013-03-15 17:17:46

标签: javascript oop dom object this

我的代码 -

<script type="application/javascript">
var firstObject = {
sayHello : function(){
        document.write("My name is "+ this.myName +"<br>");
},
myName : "Swapnesh Sinha"
};
var secondObject = {myName : "Sanjay Sinha"};

document.write("First one " + firstObject.sayHello() );
document.write("<br>");
document.write("Second one "+ secondObject.myName); 
</script>

来源 - http://learn.jquery.com/javascript-101/this-keyword/

期待输出 -

First one Swapnesh Sinha
Second one Sanjay Sinha

意外输出(从我的意义上说) -

My name is Swapnesh Sinha
First one undefined
Second one Sanjay Sinha 

让我知道为什么它返回undefined然而来源提到返回名称?或者我在我身边出错了

3 个答案:

答案 0 :(得分:1)

在你的第一个document.write中,你调用一个函数,并要求将函数的返回值连接到字符串“First one”。

评估该函数,此时“我的名字是Swapnesh Sinha”通过对象内的document.write调用输出。然而,该函数调用不返回值,因此它是undefined,并且连接到“First one”,然后打印。

答案 1 :(得分:0)

这是工作小提琴JsFIDDLE

与大多数jQuery开发人员一样,这是你无法理解的:JavaScript范围。

基本上,为了通过this访问属性,它必须嵌套在Object.prototype中。

<强>校正

当您内联定义对象属性时,调用this仍将指向正确的对象。然而,我给你的模式,即使不那么流行,也是一种更整洁,更好的方法。

prototype是OOP的JavaScript方式。如果您正在寻找可靠的OOP样式JS并且正确定义模型,改进代码可维护性和更好的编码风格,则最好使用我给您的模式定义类,因为它将允许您对静态函数进行强有力的区分和课程。它也是JavaScript的自然流程,一切都是对象。

在高级JavaScript编程(强大的Ajax应用程序或应用程序中,由于某种原因,浏览器必须执行更高级的计算),以下样式始终是首选。放置在命名空间下的静态函数仍然是单独定义的:

var namespace = {};
namespace.firstStaticFunc = function() {/*do stuff etc;*/};
namespace.secondStaticFunc = function() { return !1; };

使用定义模式的唯一原因是枚举和散列映射。例如:

var typesOfChicken = {
    RED: 'red',
    BLUE: 'blue'
};

以上内容总是用于国际化和避免硬编码值等事情。此外,它有助于JS minifiers更好地工作。鉴于上述情况,您可以说:

console.log(typesOfChicken.RED);// will print red.
console.log("red");// wil still print red

但是,当我想将红色更改为其他内容时,使用枚举我只需要进行一次更改。此外,缩小器可以用a.b替换typesOfChicken.RED,而"RED"将始终为“RED”。这是无法实现的。

var firstObject = function() { };
firstObject.prototype.myName = "Swapnesh Sinha";//this will not be nested as an instance property.
firstObject.prototype.sayHello = function() {
    alert(this.myName);// will now correctly display Swapnesh Sinha
};
// to use your first object.
var instance = new firstObject();
instance.sayHello();

要正确使用范围,请使用我给你的模式,这是一种面向对象的模式,也是在JS中定义类的正确方法。

现在你有一个很好的方式来组织你的JavaScript代码,它更容易维护,范围更加明显,最重要的是你可以立即区分静态函数和类。

答案 2 :(得分:0)

用sayHello函数中的return替换document.write()