-1

我的代码 -

<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但源提到返回名称的情况?或者我在我身边做错了什么

4

3 回答 3

1

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

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

于 2013-03-15T17:20:54.010 回答
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 缩小器更好地工作。鉴于上述情况,您可以说:

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

但是,当我想将红色更改为其他东西时,使用枚举我只需要进行一次更改。此外,缩小器可以替换typesOfChicken.RED为 ab,而"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 代码,它更容易维护,范围更明显,最重要的是你可以立即区分静态函数和类。

于 2013-03-15T17:25:18.367 回答
0

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

于 2013-03-15T17:25:45.937 回答