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