1-1 构造属性

  1. ## 创建构造函数的时候,原型对象上会有一个constructor属性,它是原型对象所独有的,它指回构造函数本身

image.png

  1. function Person(name,age){
  2. this.name = name
  3. this.age = age
  4. }
  5. var p = new Person("cheng",20)
  6. console.log(p.constructor);
  7. console.log(p.constructor == Person); // true
  8. var arr = [1,2,3]
  9. console.log(arr.constructor == Array); // true

1-2 给原型添加属性 ( 直接量形式 )

  1. # 问题:我们以直接量(对象)形式,给原型添加属性的时候,它的constructor会指向Object
  2. # 解决:重置 constructor
  1. function Person(name,age){
  2. this.name = name
  3. this.age = age
  4. }
  5. Person.prototype = {
  6. sayName:function(){
  7. console.log(this.name);
  8. },
  9. sayAge(){
  10. console.log(this.age);
  11. }
  12. }
  13. var p = new Person("cheng",20)
  14. console.log(p.constructor); //Object
  15. console.log(p.constructor == Person); // false
  16. console.log(p instanceof Person); // true
  17. ## 解决办法
  18. Person.prototype = {
  19. constructor:Person, // 重置 constructor
  20. sayName:function(){
  21. console.log(this.name);
  22. },
  23. sayAge(){
  24. console.log(this.age);
  25. }
  26. }
  27. var p = new Person("cheng",20)
  28. console.log(p.constructor); // Person
  29. console.log(p.constructor == Person); // true

1-3 公有属性和私有属性

  1. # 公有属性: 一般在原型对象上
  2. # 私有属性: 通过this关键字去添加的

1-3-1 hasOwnProperty: 可以判断属性是私有的还是公有的

  1. function Person(name,age){
  2. this.name = name
  3. this.age = age
  4. }
  5. Person.prototype = {
  6. constructor:Person,
  7. sayName:function(){
  8. console.log(this.name);
  9. },
  10. sayAge(){
  11. console.log(this.age);
  12. }
  13. }
  14. var p = new Person("cheng",20)
  15. console.log(p.hasOwnProperty("name")); // true 私有的
  16. console.log(p.hasOwnProperty("sayName")); // false 公有的
  17. //判断constructor是否是原型对象的私有属性
  18. console.log(Person.prototype.hasOwnProperty("constructor")); // true

1-3-2 in 判断对象是否包含这个属性,包括(私有和公有)

  1. in hasOwnProperty 区别
  2. in:判断对象是否包含这个属性
  3. hasOwnProperty:判断是否是私有属性
  1. var person1 = {
  2.   name: "Nicholas",
  3.   sayName: function() {
  4.     console.log(this.name);
  5.   }
  6. };
  7. console.log("name" in person1);           // true
  8. console.log(person1.hasOwnProperty("name"));    // true
  9. console.log("toString" in person1);         // true
  10. console.log(person1.hasOwnProperty("toString")); // false

1-3-3 鉴别一个属性是否是原型属性

  1. var book = {
  2.   title: "The Principles of Object-Oriented JavaScript"
  3. };
  4. function hasPrototypeProperty(object, name) {
  5.   return name in object &&!object.hasOwnProperty(name);
  6. }
  7. console.log(hasPrototypeProperty(book, "title"));       // false
  8. console.log(hasPrototypeProperty(book, "hasOwnProperty"));  // true