Javascript 这些功能之间的区别

Javascript 这些功能之间的区别,javascript,Javascript,这三种功能之间的区别是什么?第二个函数中的新运算符有什么用途?为什么要使用第一个函数而不是第三个函数 首先 第二 第三 这个警报实际上很难检查效果,所以在我的解释中,我假设alertname实际上是name。警报返回未定义的,而不是其输入 第一个函数生成一个可以像类一样使用的函数。然后将其与new一起使用,并创建了两个对象,k和j。这使得您可以访问k.name=='kkk'和j.name=='jjj'这样的名称 第二个与第一个类似,但k2.name和j2.name未定义。您可以访问person2

这三种功能之间的区别是什么?第二个函数中的新运算符有什么用途?为什么要使用第一个函数而不是第三个函数

首先

第二

第三

这个警报实际上很难检查效果,所以在我的解释中,我假设alertname实际上是name。警报返回未定义的,而不是其输入

第一个函数生成一个可以像类一样使用的函数。然后将其与new一起使用,并创建了两个对象,k和j。这使得您可以访问k.name=='kkk'和j.name=='jjj'这样的名称

第二个与第一个类似,但k2.name和j2.name未定义。您可以访问person2.name,但它只等于上次实例化它时的名称;因此,person2.name=='jjj2'


第三个类似于第二个,但没有滥用新的。k3和j3未定义,如果尝试访问k3.name和j3.name,将出现错误。同样,您将能够使用person3.name访问上次传递给person3的值。

您的第二个和第三个函数将不会为person2.name和person3.name分配任何内容。所以从技术上讲,只有第一个函数是有效的,这就是为什么应该使用它

javascript中有一个非常重要的概念,称为上下文。上下文可以看作是一个对象。此关键字是指函数正在执行的上下文

借助此工具,可以在当前上下文中创建新属性。例如:

var person = function(name) {
    this.name = name; // this can be accessed externally, just like public properties
    var _name = name; // this can be accessed only within the function, just like a private property
    __name = name; // if a property is not properly initialized with a 'var' or 'this', it becomes part of 'window' object, hence you can access it from anywhere using 'window.__name'
}
您可以使用new关键字创建新上下文:

您始终可以访问不同的上下文及其属性:

alert(k.name); // this will show 'kkkk2'
alert(j.name); // this will show 'jjjj'

第一个函数声明了一个函数person,该函数可能被用作对象构造函数——这是最接近JavaScript的类。这意味着,如果使用new person调用它,JS将创建person对象的新实例,并且在构造函数中,它引用该新实例,因此this.name将在该实例上创建一个属性。不幸的是,您分配给该属性的值未定义,因为alert函数返回undefined。如果您说this.name=name,它将存储函数参数中的值-这将是一种更正常的用法。您的k和j对象都有一个使用此语法的name属性

第二个版本,同样使用新的person2语法,将创建作为person2实例的对象,但是说person2.name会在函数本身上创建一个属性。因此,无法直接从实例k2和j2访问该属性,并且每次调用person2时,person2.name属性都会被覆盖。从一般意义上讲,在这样的函数上拥有属性是没有问题的,但是在这种情况下,除非您确实需要记住与最近调用相关联的名称,否则就没有意义了

第三个版本,不使用new关键字,将简单地将person3的返回值分配给k3和j3变量,但是由于没有显式返回任何内容,因此它们将以未定义结束。person3.name的工作方式与person2完全相同


编辑:除此之外,请注意名称在函数上下文中具有特殊含义,因此对于第二个和第三个选项,它的行为与使用其他名称创建的属性(例如myName)的行为并不完全相同。

new用于执行构造函数调用,而不是常规函数调用。在构造函数中,您希望使用它向新创建的实例添加内容。然后运行console.logperson2.name和console.logperson3.name。两者都输出空字符串。在你的回答中,这不是矛盾的一部分吗?还有,请不要滥用名称是什么意思?@clime:哦,我忘了函数上的名称是用来做其他事情的。如果您将name重命名为name2,那么它应该像我描述的那样工作。回答你的另一个问题,那是一个打字错误;“不滥用名称”应为“不滥用新名称”。是的,在将person3.name替换为person3.name2后,它的工作方式与您描述的相同。“名称2”在这里有点像静态属性吗?@clime:是的,你可以这么说。
var person3 = function(name){
    person3.name = alert(name);

};

var k3 = person3('kkkk3');
var j3 = person3('jjjj3');
var person = function(name) {
    this.name = name; // this can be accessed externally, just like public properties
    var _name = name; // this can be accessed only within the function, just like a private property
    __name = name; // if a property is not properly initialized with a 'var' or 'this', it becomes part of 'window' object, hence you can access it from anywhere using 'window.__name'
}
var k = new person2('kkkk2'); // this will create a new context, create a property name in it and assign it value passed to function.
var j = new person('jjjj'); // this will create another context
alert(k.name); // this will show 'kkkk2'
alert(j.name); // this will show 'jjjj'