声明:
Javascript可以在不创建类的情况下创建对象。
该声明有效吗?也许我没有在这里得到这个概念......
例如,如果我在Javascript中创建一个对象:
var mercedes = new Object();
mercedes.speed = "260";
mercedes.model = "SLS";
mercedes.year = 1969;
这里我没有课,但我已经有了一个实例。这是否意味着我不需要在Javascript中定义类?
还有一个问题是,如上所述创建对象与使用以下方法创建对象之间的Javascript有何不同:
myCar["speed"] = "260";
myCar["model"] = "SLS";
myCar["year"] = 1969;
答案 0 :(得分:4)
在javascript
中没有课程。话虽如此,您可以使用几种不同的方式模拟类。
使用函数并为其原型定义方法
var Person = function(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
};
// you can define Person.fullname = function() {} straight to the function
// drawback to this is fullname function will be created everytimg you create a new Person
// instead you can create fullname in the prototype of the Person so it only gets created once
Person.prototype.fullname = function() {
return this.firstName + ' ' + this.lastName;
};
var person = new Person('John', 'Doe');
person.fullname(); // John Doe
使用对象文字
var Person = {
firstName: 'John',
lastName: 'Doe',
fullname: function() {
return this.firstName + ' ' + this.lastName;
}
};
Person.fullname(); // John Doe
Person.firstName = 'Jane';
Person.fullname(); // Jane Doe
使用Singleton
var person = new function() {
this.firstName = 'John';
this.lastName = 'Doe';
this.fullname = function() {
return this.firstName + ' ' + this.lastName;
};
};
person.fullname(); // John Doe
person.firstName = 'Jane';
person.fullname(); // Jane Doe
如果您打算更接近java
类的工作方式,应用继承等,那么我建议您使用第一种方法。下面是使用prototype
的简单继承示例。
var Person = function(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
};
Person.prototype.fullname = function() {
return this.firstName + ' ' + this.lastName;
};
Person.prototype.getFirstName = function() {
return this.firstName;
};
Person.prototype.getLastName = function() {
return this.lastName;
};
Person.prototype.setLastName = function(lastName) {
return this.lastName = lastName;
};
Person.prototype.setFirstName = function(firstName) {
return this.firstName = firstName;
};
var Student = function(firstName, lastName, grade) {
this.grade = grade;
Person.call(this, firstName, lastName);
};
Student.prototype = Object.create(Person.prototype);
Student.prototype.getGrade = function() {
return this.grade;
};
var student = new Student('John', 'Doe', '5th');
student.fullname(); // John Doe
student.getFirstName(); // John
student.setFirstName('Jane');
student.getFirstName(); // Jane
student.getGrade(); // 5th
这应该解释如何使用javascript
中类似于java
中常用的类。
使用dot notation
和brackets
访问对象属性有什么区别?
长答案简短,两者表现完全相同。但是有些情况dot notation
并不总是有效。例如:
var person = {
"first name": "john",
"last name": "doe",
"fullname": "john doe"
};
person.fullname; // john doe
// to access first name property of person
person.first name; // will not work
person["first name"]; // john
答案 1 :(得分:3)
javascript中有类。但您也可以使用.prototype属性继承对象属性。这个W3School's article可以更好地解释它。
对于第二个问题,使用括号或点属性时没有什么区别。使用变量访问对象属性时,使用括号访问属性非常有用。例如:
var obj = {}:
var val = 'value';
obj[val] = 'new value';
console.log(obj[val]); // Output: new value
以上内容也适用于:
var obj = { 'value' = 'new value'};
var val = 'value';
console.log(obj[val]); // Output: new value
答案 2 :(得分:2)
这已经在SO上已经多次回答了,所以我只是链接了一个我在学习javascript时经常提到的非常好的答案: https://stackoverflow.com/a/387733/3299157
快速回答,是的,你可以在Javscript中创建一个对象,而无需创建传统的面向对象的类。 对于你的第二个问题,使用"括号样式"时没有明显的区别。
答案 3 :(得分:1)
JavaScript没有类的概念。使用JavaScript,您可以只编写代码,而不是从头开始定义类。
使用括号表示法,您可以动态决定要访问的属性,并且可以在属性名称中使用特殊字符。
var prop = "speed";
myCar = {}; // create a object
myCar[prop] = "260"; // using dynamically property
myCar["speed.a"] = "265"; // using special characters
参考:面向对象JavaScript的原理,Nicholas C. Zakas