JavaScript 对象构造器


实例

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 对象构造器</h1>
  5. <p id="demo">
  6. <script>
  7. // Person 对象的构造器函数
  8. function Person(first, last, age, eye) {
  9. this.firstName = first;
  10. this.lastName = last;
  11. this.age = age;
  12. this.eyeColor = eye;
  13. }
  14. // 创建 Person 对象
  15. var myFriend = new Person("埃隆", "马斯克", 50, "blue");
  16. // 显示年龄
  17. document.getElementById("demo").innerHTML =
  18. "我父亲已经 " + myFriend.age + "岁了。";
  19. </script>
  20. </body>
  21. </html>

用大写首字母对构造器函数命名是个好习惯。


对象类型(蓝图)(类)

前一章的实例是有限制的。它们只创建单一对象。

有时我们需要创建相同“类型”的许多对象的“蓝图”。

创建一种“对象类型”的方法,是使用对象构造器函数

在上面的例子中,函数 Person() 就是对象构造器函数。

通过 new 关键词调用构造器函数可以创建相同类型的对象:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 对象构造器</h1>
  5. <p id="demo">
  6. <script>
  7. // Person 对象的构造器函数
  8. function Person(first, last, age, eye) {
  9. this.firstName = first;
  10. this.lastName = last;
  11. this.age = age;
  12. this.eyeColor = eye;
  13. }
  14. // 创建 Person 对象
  15. var myFriend = new Person("埃隆", "马斯克", 50, "蓝色");
  16. var myBrother = new Person("马克", "扎克伯格", 40, "绿色");
  17. // 显示年龄
  18. document.getElementById("demo").innerHTML =
  19. "我朋友是 " + myFriend.age + "岁. 我哥哥是 " + myBrother.age + "岁。";
  20. </script>
  21. </body>
  22. </html>

this 关键词

在 JavaScript 中,被称为 this 的事物是代码的“拥有者”。

this 的值,在对象中使用时,就是对象本身。

在构造器函数中,this 是没有值的。它是新对象的替代物。 当一个新对象被创建时,this 的值会成为这个新对象。

请注意 this 并不是变量。它是关键词。您无法改变 this 的值。


为对象添加属性

为已有的对象添加新属性很简单:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 对象构造器</h1>
  5. <p id="demo">
  6. <script>
  7. // Person 对象的构造器函数
  8. function Person(first, last, age, eye) {
  9. this.firstName = first;
  10. this.lastName = last;
  11. this.age = age;
  12. this.eyeColor = eye;
  13. }
  14. // 创建两个 Person 对象
  15. var myFriend = new Person("埃隆", "马斯克", 50, "蓝色");
  16. var myBrother = new Person("马克", "扎克伯格", 40, "绿色");
  17. // 为第一个对象添加国籍
  18. myFriend.nationality = "美国人";
  19. // 显示国籍
  20. document.getElementById("demo").innerHTML =
  21. "我朋友是 " + myFriend.nationality;
  22. </script>
  23. </body>
  24. </html>

新属性被添加到 myFather。不是 myMother,也不是任何其他 person 对象。


为对象添加方法

为已有的对象添加新方法很简单:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 对象构造器</h1>
  5. <p id="demo">
  6. <script>
  7. // Person 对象的构造器函数
  8. function Person(first, last, age, eye) {
  9. this.firstName = first;
  10. this.lastName = last;
  11. this.age = age;
  12. this.eyeColor = eye;
  13. }
  14. // 创建两个 Person 对象
  15. var myFriend = new Person("埃隆", "马斯克", 50, "蓝色");
  16. var myBrother = new Person("马克", "扎克伯格", 40, "绿色");
  17. // 向第一个对象添加 name 方法
  18. myFriend.name = function() {
  19. return this.firstName + " " + this.lastName;
  20. };
  21. // 显示全名
  22. document.getElementById("demo").innerHTML =
  23. "我朋友是 " + myFriend.name();
  24. </script>
  25. </body>
  26. </html>

新方法被添加到 myFather。不是 myMother,也不是任何其他 person 对象。


为构造器添加属性

与向已有对象添加新属性不同,您无法为对象构造器添加新属性:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 对象构造器</h1>
  5. <p>您不能将新属性添加到构造函数。</p>
  6. <p id="demo">
  7. <script>
  8. // Person 对象的构造器函数
  9. function Person(first, last, age, eye) {
  10. this.firstName = first;
  11. this.lastName = last;
  12. this.age = age;
  13. this.eyeColor = eye;
  14. }
  15. // 您不能将新属性添加到构造函数
  16. Person.nationality = "美国人";
  17. // 创建两个 Person 对象
  18. var myFriend = new Person("埃隆", "马斯克", 50, "蓝色");
  19. var myBrother = new Person("马克", "扎克伯格", 40, "绿色");
  20. // 显示国籍
  21. document.getElementById("demo").innerHTML =
  22. "我朋友是 " + myFriend.nationality;
  23. </script>
  24. </body>
  25. </html>

如需向构造器添加一个新属性,您必须添加到构造器函数:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 对象构造器</h1>
  5. <p id="demo">
  6. <script>
  7. // Person 对象的构造器函数
  8. function Person(first, last, age, eye) {
  9. this.firstName = first;
  10. this.lastName = last;
  11. this.age = age;
  12. this.eyeColor = eye;
  13. this.nationality = "美国人";
  14. }
  15. // 创建两个 Person 对象
  16. var myFriend = new Person("埃隆", "马斯克", 50, "蓝色");
  17. var myBrother = new Person("马克", "扎克伯格", 40, "绿色");
  18. // 显示国籍
  19. document.getElementById("demo").innerHTML =
  20. "My friend is " + myFriend.nationality + ". My brother is " + myBrother.nationality;
  21. </script>
  22. </body>
  23. </html>

这样对象属性就可以拥有默认值。


为构造器添加方法

您的构造器函数也可以定义方法:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 对象构造器</h1>
  5. <p id="demo">
  6. <script>
  7. // Person 对象的构造器函数
  8. function Person(first, last, age, eye) {
  9. this.firstName = first;
  10. this.lastName = last;
  11. this.age = age;
  12. this.eyeColor = eye;
  13. this.name = function() {
  14. return this.firstName + " " + this.lastName
  15. };
  16. }
  17. // 创建 Person 对象
  18. var myFriend = new Person("埃隆", "马斯克", 50, "蓝色");
  19. // 显示全名
  20. document.getElementById("demo").innerHTML =
  21. "我朋友是 " + myFriend.name();
  22. </script>
  23. </body>
  24. </html>

与向已有对象添加新方法不同,您无法为对象构造器添加新方法。

必须在构造器函数内部向一个对象添加方法:

  1. function Person(firstName, lastName, age, eyeColor) {
  2. this.firstName = firstName;
  3. this.lastName = lastName;
  4. this.age = age;
  5. this.eyeColor = eyeColor;
  6. this.changeName = function (name) {
  7. this.lastName = name;
  8. };
  9. }

changeName() 函数把 name 赋值给 person 的 lastName 属性。

现在您可以试一试:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 对象构造器</h1>
  5. <p id="demo">
  6. <script>
  7. // Person 对象的构造器函数
  8. function Person(firstName,lastName,age,eyeColor) {
  9. this.firstName = firstName;
  10. this.lastName = lastName;
  11. this.age = age;
  12. this.eyeColor = eyeColor;
  13. this.changeName = function (name) {
  14. this.lastName = name;
  15. }
  16. }
  17. // 创建 Person 对象
  18. var myFriend = new Person("埃隆", "马斯克", 50, "蓝色");
  19. // 修改姓氏
  20. myFriend.changeName("乔布斯");
  21. // 显示姓氏
  22. document.getElementById("demo").innerHTML =
  23. "我朋友的名字是 " + myFriend.lastName;
  24. </script>
  25. </body>
  26. </html>

通过用 myMother 替代 this,JavaScript 可以获知目前处理的哪个 person。


内置 JavaScript 构造器

JavaScript 提供用于原始对象的构造器:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 对象构造器</h1>
  5. <p id="demo">
  6. <script>
  7. var x1 = new Object(); // 新的 Object 对象
  8. var x2 = new String(); // 新的 String 对象
  9. var x3 = new Number(); // 新的 Number 对象
  10. var x4 = new Boolean(); // 新的 Boolean 对象
  11. var x5 = new Array(); // 新的 Array 对象
  12. var x6 = new RegExp(); // 新的 RegExp 对象
  13. var x7 = new Function(); // 新的 Function 对象
  14. var x8 = new Date(); // 新的 Date 对象
  15. // 显示所有对象的类型
  16. document.getElementById("demo").innerHTML =
  17. "x1: " + typeof x1 + "<br>" +
  18. "x2: " + typeof x2 + "<br>" +
  19. "x3: " + typeof x3 + "<br>" +
  20. "x4: " + typeof x4 + "<br>" +
  21. "x5: " + typeof x5 + "<br>" +
  22. "x6: " + typeof x6 + "<br>" +
  23. "x7: " + typeof x7 + "<br>" +
  24. "x8: " + typeof x8 + "<br>";
  25. </script>
  26. <p>没有必要使用 String()、Number()、Boolean()、Array() 以及 RegExp()。</p>
  27. </body>
  28. </html>

Math() 对象不再此列。Math 是全局对象。new 关键词不可用于 Math。


注意事项

正如以上所见,JavaScript 提供原始数据类型字符串、数字和布尔的对象版本。但是并无理由创建复杂的对象。原始值快得多!

请使用对象字面量 {} 代替 new Object()

请使用字符串字面量 "" 代替 new String()

请使用数值字面量代替 Number()

请使用布尔字面量代替 new Boolean()

请使用数组字面量 [] 代替 new Array()。请使用模式字面量代替 new RexExp()

请使用函数表达式 () {} 代替 new Function()

实例
  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <h1>JavaScript 对象构造器</h1>
  5. <p id="demo">
  6. <script>
  7. var x1 = {}; // 对象
  8. var x2 = ""; // 字符串
  9. var x3 = 0; // 数字
  10. var x4 = false; // 布尔
  11. var x5 = []; // 对象(非数组)
  12. var x6 = /()/; // 对象
  13. var x7 = function(){}; // 函数
  14. // 显示所有类型
  15. document.getElementById("demo").innerHTML =
  16. "x1: " + typeof x1 + "<br>" +
  17. "x2: " + typeof x2 + "<br>" +
  18. "x3: " + typeof x3 + "<br>" +
  19. "x4: " + typeof x4 + "<br>" +
  20. "x5: " + typeof x5 + "<br>" +
  21. "x6: " + typeof x6 + "<br>" +
  22. "x7: " + typeof x7 + "<br>";
  23. </script>
  24. </body>
  25. </html>

字符串对象

通常,字符串被创建为原始值:var firstName = "John"但是也可以使用 new 关键词创建字符串对象:var firstName = new String("John")

请在 JS 字符串这一章中学习为何不应该把字符串创建为对象。


数字对象

通常,数值被创建为原始值:var x = 456但是也可以使用 new 关键词创建数字对象:var x = new Number(456)

请在 JS 数字这一章中学习为何不应该把数值创建为对象。


布尔对象

通常,逻辑值被创建为原始值:var x = false

但是也可以使用 new 关键词创建逻辑对象:var x = new Boolean(false)

请在 JS 逻辑这一章中学习为何不应该把逻辑值创建为对象。

分类导航