繁体   English   中英

详细了解JavaScript:它是一个类,一个函数,还是一个变量?

[英]Understanding JavaScript in detail: is it a class, a function, or just a variable?

我是JavaScript的初学者,我发现一个非常令人困惑的概念。 请考虑以下代码:

var person = {
     firstName   :"Penelope",
     lastName    :"Barrymore",
     // Since the "this" keyword is used inside the showFullName method below, and the showFullName method is defined on the person object,​
     // "this" will have the value of the person object because the person object will invoke showFullName ()​
     showFullName:function () {
         console.log (this.firstName + " " + this.lastName);
     }
​
 }
​
 person.showFullName (); // Penelope Barrymore

人是一个阶级或功能还是只是一个变量?

如果假设那个人是一个类,则是代码person.showFullName (); 调用它的正确方法,因为在C#或我们编写的任何其他语言中

person perObj = new person();
perObj.showFullName();

person是一个对象。 它有3个属性,名为firstNamelastNameshowFullName 前两个属性包含字符串。 最后一个属性包含一个函数。

当您使用语法<expression>.<function>(<arguments>)调用函数时,其中<expression>求值为对象, <function>是其属性之一的名称,然后在函数运行时变量this设置为对象。 这就是this.firstNamethis.lastName能够访问对象的那些属性的方式。

当只有一个对象时,此功能不是很有用,因为它可以很容易地使用person变量。 但是你可以对多个对象使用相同的功能。

function showFull() {
    console.log(this.firstName + " " + this.lastName);
}
var person1 = {
    firstName: "Penelope",
    lastName: "Barrymore",
    showFullName: showFull
};
var person2 = {
    firstName: "John",
    lastName: "Smith",
    showFullName: showFull
}
person1.showFullName(); // Penelope Barrymore
person2.showFullName(); // John Smith

只是为了添加到Barmar,你也可以做到这样的事情(如果你发现它更像C#):

var person = function() {
     this.firstName = "";
     this.lastName = "";
} 

person.prototype.showFullName = function () { 
     console.log (this.firstName + " " + this.lastName); 
} 

var perObj = new person();
perObj.firstName = "Penelope";
perObj.lastName = "Barrymore";
perObj.showFullName();

这是一个对象,而不是一个类。

以这种方式考虑:

在其他经典的OO语言中,当您实例化一个类时 ,您会获得一个实例 ; 这个实例有点像JavaScript 对象 -

JavaScript对象是属性的动态“包”。 它是一组名称 - 值对,这些值可以是任何类型 - 函数或对象本身。

在您的情况下, firstName, lastName, and showFullName是person对象的特性。

使用点(。)表示法访问对象的属性,例如: person.firstName, person.showFullName()

person实际上是JavaScript中的对象字面值。 对象文字是被定义为的文字

var obj = {
    // Properties and methods
};

他们的类型是对象。 在JavaScript中,我们没有任何称为类的东西。

  • 一切都是对象。 (甚至功能)

对象文字是用大括号括起来的以逗号分隔的名称 - 值对列表。 对象文字封装数据,将其封装在整洁的包中。

http://www.dyn-web.com/tutorials/object-literal/


虽然我们在ECMAScript 6中有类,但它们不像其他语言那样是真正的类。

MDN说:

ECMAScript 6中引入了JavaScript类,并且是JavaScript现有的基于原型的继承的语法 类语法没有向JavaScript引入新的面向对象的继承模型。 JavaScript类提供了更简单,更清晰的语法来创建对象和处理继承。

人是一个阶级或功能还是只是一个变量?

JavaScript没有类。 变量person是指向保存对象的内存位置的变量。

对象本身有几个方面。 附加了一组属性,这些属性都附加到person对象。 其中一个属性包含一个值,它是一个函数对象。 此函数对象包含执行上下文。

执行上下文ECMA具有本地环境,词法环境和此绑定。 此绑定指向person对象。 函数的本地环境作用于函数内部的声明范围,函数的词法环境作用于Person对象可用的声明。

代码中的person是一个object 换句话说, personObject的实例, person原型与其他对象中的原型相同,由{}初始化程序创建:

// Object initialiser or literal
person = {
  some methods and properties
}

// Called as a constructor
person = new Object({some methods and properties})

这意味着你的person对象从prototype继承了Object特定的方法,比如hasOwnProperty()toString()valueOf()等。

最后编写的Object constructor不仅可以创建“Hash-like”对象,还可以创建任何其他类型的对象(Arrays,Strings等)。 javascript中的所有内容都是对象,甚至是基元(它们是包装对象,并且有自己的构造函数)。

例:

persons     = new Object([person_1, person_2, person_3])    
person_age  = new Object(18)
person_name = new Object('John')

我们可以用其他语法编写以上所有表达式:

persons     = new Array(person_1, person_2, person_3) //or      
persons     = [person_1, person_2, person_3]

person_age  = new Number(18) //or    
person_age  = 18

person_name = new String('John') //or    
person_name = 'John'

可以使用适当的全局对象创建字符串和数字而不使用new

MDN上的页面

新对象类型

如果需要创建新类型的对象,必须定义新的构造函数并定义原型(ECMAScript 5.1)

NewObjectType = function(arg1, arg2){
   this.arg1 = arg1 //define object's property arg1
   this.arg2 = arg2 //define object's property arg2

   private_function = function(){}
   this.public_function = function(){} //this function can't be inherited, because not in prototype
}

NewObjectType.prototype = {
   constructor : NewObjectType,
   public_inheritable_function_1 : function(){},
   public_inheritable_function_2 : function(){}
}

//creating new instance of NewObjectType:

my_new_object = new NewObjectType(arg1, arg2)

my_new_object instanceof NewObjectType //true
my_new_object instanceof Object        //true, because prototype was created with {} literal, and Object's prototype built into the prototype chain

说明:

new NewObjectType被调用时,NewObjectType的新实例将被创建。 NewObjectType构造函数的Prototype属性将与新实例的隐藏__proto__属性链接。

没有原型的对象

如果需要在没有Object方法的情况下创建清晰对象,则必须使用create方法在没有原型的情况下创建它:

person = Object.create(null)

它可以作为简单的键值存储使用

键入,不从Object继承

如果需要在原型链中创建没有Object原型的新类型的对象,可以使用以下语法:

NewObjectType = function(arg1, arg2){}
NewObjectType.prototype = Object.create(null)
NewObjectType.prototype.constructor = NewObjectType 
NewObjectType.prototype.public_inheritable_function = function(){}

my_new_object = new NewObjectType(arg1, arg2)

my_new_object instanceof NewObjectType //true
my_new_object instanceof Object        //false

JavaScript没有类或不是基于类的语言。 相反,我们说它是一种基于原型的语言。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM