Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这在javascript中没有按预期填充数据_Javascript_Oop_Dom_Object_This - Fatal编程技术网

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

这在javascript中没有按预期填充数据,javascript,oop,dom,object,this,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.wr

我的代码-

<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>
意外输出(从我的感觉)-


让我知道为什么它返回
未定义的
,但是source提到了返回名称?或者我在第一个
文档中出错了。编写
,调用函数,并要求将函数的返回值连接到字符串“first one”


函数被求值,此时“我的名字是Swapnesh Sinha”通过
文档输出。在对象内部编写
调用。但是,该函数调用不返回值,因此它是未定义的,并被连接到“第一个”,然后打印出来。

这是工作小提琴:

对于大多数jQuery开发人员来说,以下是您未能理解的内容:JavaScript作用域

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

校正

在内联定义对象属性时,调用
this
仍将指向正确的对象。然而,我给你的模式,尽管不那么流行,却是一个更整洁、更好的方法

原型是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
替换为a.b,而
中的“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();
为了正确地使用scope,请使用我给您的模式,这是一种面向对象的模式,也是在JS中定义类的正确方法


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

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

你的sayHello函数不会返回任何东西,它只是执行一个
文档。write()
,因此默认情况下,它返回
未定义的
替换文档。write()在sayHello函数中返回return。换句话说,替换
文档。将
内部
sayHello
写入
return
只是为了澄清一下,函数确实返回未定义类型的值。呃,这是不对的。他唯一的问题是不理解返回和document.write()是如何工作的,正如其他人所建议的那样。你完全错了。你不需要在原型上放置东西就可以使用
这个
在函数调用中引用调用函数的对象(比如firstObject)。你根本不需要原型,但你实际上说的是不正确的东西。你在骗他。你的答案是错误的。这句话是错误的:“在你的例子中,你正在做一个简单的赋值,所以在你的sayHello函数中,这实际上是指向窗口对象,而不是第一个对象。”这是错误的。在sayHello函数中,这是指firstObject。从输出中可以看出这一点。
console.log(typesOfChicken.RED);// will print red.
console.log("red");// wil still print 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();