在javascript中创建类以创建对象和在Java中创建类和对象之间的区别

时间:2016-01-26 22:55:50

标签: javascript class object

声明:

  

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;

4 个答案:

答案 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 notationbrackets访问对象属性有什么区别?

长答案简短,两者表现完全相同。但是有些情况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