JavaScript创建对象的新实例

24

所以我正在设计一个成绩单接口,我定义了一个课程:

<script>
course = new Object();
 var name;
 var gradingareas;
 var finalgrade;
</script>

然后我想创建一个新的实例:

 var gradingareas = new Array("Homework", "Classwork", "Exams");

 course1 = new course("CS1500", gradingareas, 85);

我也尝试过在前面不加var,但是无济于事。我收到了一个“Uncaught TypeError: Object is not a function”的错误提示。我对JavaScript非常陌生,所以我甚至不知道自己是否正确地处理了它。感谢任何帮助。


1
请先阅读这里的基础知识:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Working_with_Objects。 - VisioN
4个回答

56

您现有的代码:

// Creates a new, empty object, as a global
course = new Object();
// Creates three new variables in the global scope.
var name;
var gradingareas;
var finalgrade;

变量和对象之间没有联系。

看起来你想要更像这样的东西:

function Course(name, gradingareas, finalgrade) {
    this.name = name;
    this.gradingareas = gradingareas;
    this.finalgrade = finalgrade;
}

那么:

var course1 = new Course("CS1500", gradingareas, 85);

注意构造函数名称使用大写字母。这是JS社区的惯例。


那么我该如何引用使用函数创建的课程字段呢?我的想法是像在Java中实例化一个类一样保留这些字段。 - user1991562
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Hugo Nava Kopp

40

JS采用原型式而非基于类的编程方式,如果你是初学者,学习这种编程方式比尝试从中融合经典的继承模型要更有优势,但在JS中,经典的继承方式也依然存在。

无论如何,回答如何访问变量的问题:

course1.name与上面的示例一样可以正常使用。

如果想将数据私有化,可以使用闭包来实现:

var Course = function(name, grade) {
  // Private data
  var private = {
    name: name,
    grade: grade
  }

  // Expose public API
  return {
    get: function( prop ) {
      if ( private.hasOwnProperty( prop ) ) {
        return private[ prop ];
      }
    }
  }
};

然后实例化一个新对象:

var course = new Course('使用JavaScript进行编程', 'A');

并开始使用所有的私有数据:

course.get('name');

当然,您可能还想要设置器来操作这些数据;)


4
尽管这两个答案都是正确的,但是这个答案对我来说比被接受的答案更有意义。 - carbontwelve

1
这段代码的功能如下:
// Declares a memory variable called course and stores and object in it
var course = new Object();

// Declares three variables
 var name;
 var gradingareas;
 var finalgrade;

这些声明的变量并不会自动连接到对象。如果您想要在对象上声明这些属性,有两个选项:
  1. 将它们声明为对象的属性
  2. 将它们声明在对象的原型

示例1:将它们声明为对象的属性:

// Declares a memory variable called course and stores and object in it
var course = new Object();

// Access or create new properties with . or [] operator
course.name = 'math';
course.gradingareas = 'muliple';
course['finalgrade'] = 'A'

console.log(course);


示例2:在原型上声明它们:

// Create a constructor function
function Course (name, grade) {
  this.name = name;
  this.grade = grade;
}

// course is added on the prototype
Course.prototype.gradingareas = 'some gradingareas';

// the name and the grade are added on the object itself
var course = new Course ('willem', 10);

console.log(course);


1
要使用构造函数和默认值创建一个非常简单的对象,您可以执行以下操作:
//My object with constructor
var myObjectWithConstrutorFunction = {

    //construtor function with default values in constructor
    myConstrutor: function(Name = 'bob', Age = 18){
        this.Name = name;
        this.Age = age;
    }
};

// instance
var myInstance = new myObjectWithConstrutorFunction.myConstrutor();

// show on console
console.log('object with constructor function: ', myInstance);

// show properties 
console.log(myInstace.Name, myInstance.Age);

PS:如果您正在创建一个外部类,最好使用与类名相同的构造函数名称


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接