Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.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_Javascript Objects - Fatal编程技术网

详细理解JavaScript:它是一个类、一个函数还是仅仅是一个变量?

详细理解JavaScript:它是一个类、一个函数还是仅仅是一个变量?,javascript,javascript-objects,Javascript,Javascript Objects,我是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 o

我是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是一个类,那么代码是
person.showFullName()调用它的正确方式,因为我们使用C#或任何其他语言编写

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

?人是一个对象。它有3个属性,分别名为
firstName
lastName
、和
showFullName
。前两个属性包含字符串。最后一个属性包含一个函数

当您使用语法
()
调用函数时,其中
计算结果为一个对象,并且
是其一个属性的名称,则当函数运行特殊变量
时,此
设置为该对象。这就是
this.firstName
this.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

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

为了添加到Barmar,您也可以做类似的事情(如果您发现它更类似于C#):


它是一个对象,不是一个类

这样考虑:

在其他经典OO语言中,当实例化一个类时, 您将获得一个实例;这个实例相当于一个JavaScript对象-

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

在您的例子中,
firstName、lastName和showFullName
是person对象的属性

使用点(.)符号访问对象的属性,
例如:
person.firstName,person.showFullName()

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

var obj = {
    // Properties and methods
};
它们的类型是object。在JavaScript中,我们没有所谓的类

  • 一切都是对象。(偶数函数)
对象文字是以逗号分隔的名称-值对列表,用大括号括起来。对象文字将数据封装在一个整洁的包中


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

说:

JavaScript类是在ECMAScript 6中引入的,并且是语法的 sugar优于JavaScript现有的基于原型的继承。这个 类语法不是引入新的面向对象继承 模型转换为JavaScript。JavaScript类提供了一种更简单、更简单的方法 创建对象和处理继承的更清晰语法

人是一个类、函数还是仅仅是一个变量

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

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


有一个本地环境、一个词汇环境和一个this绑定。此绑定指向person对象。函数的本地环境的作用域是函数内部的声明,函数的词法环境的作用域是Person对象可用的声明。

Person
在代码中是一个
对象。换句话说,
person
Object
的一个实例,
person
原型与其他对象中的原型相同,由
{}
初始值设定项创建:

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

// Called as a constructor
person = new Object({some methods and properties})
这意味着您的
person
对象继承了原型中特定于对象的方法,例如
hasOwnProperty()
toString()
valueOf()
,等等

上次编写的
对象构造函数
不仅可以创建“类似散列”的对象,还可以创建任何其他类型的对象(数组、字符串等)。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

新对象类型

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

说明:

persons     = new Object([person_1, person_2, person_3])    
person_age  = new Object(18)
person_name = new Object('John')
调用
newnewobjecttype
时,将创建NewObjectType的新实例
Prototype
NewObjectType的属性
构造函数将与新实例的隐藏的
\uuuuuuuuuuuuuuuuu
属性链接

没有原型的对象

如果需要在不使用对象方法的情况下创建清晰对象,则必须使用创建方法在不使用原型的情况下创建该对象:

person = Object.create(null)
它可以用作简单的键值存储

类型,不是从对象继承的

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

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

我也总是觉得这很困惑。而且不可靠。我很想看到详细的答案,但我的解决方案总是:不要使用它,它不会咬你。我要做一个
功能人员
,然后做一个
人员=新人员
。有时候所有的静态都足够好了,然后我会到处使用
person.firstName
等,所以没有
这个
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