欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaScript 简单了解什么是对象和继承

程序员文章站 2022-04-11 18:53:13
...

对象的创建模式

  • Object构造函数模式
    var obj = {};
    obj.name = 'Tom'
    obj.setName = function(name){this.name=name}
    
  • 对象字面量模式
    var obj = {
      name : 'Tom',
      setName : function(name){this.name = name}
    }
    
  • 构造函数模式
    function Person(name, age) {
      this.name = name;
      this.age = age;
      this.setName = function(name){this.name=name;};
    }
    new Person('tom', 12);
    
  • 构造函数+原型的组合模式
    function Person(name, age) {
      this.name = name;
      this.age = age;
    }
    Person.prototype.setName = function(name){this.name=name;};
    new Person('tom', 12);
    

继承模式

  • 原型链继承 : 得到方法

    function Parent(){}
    Parent.prototype.test = function(){};
    function Child(){}
    Child.prototype = new Parent(); // 子类型的原型指向父类型实例
    Child.prototype.constructor = Child
    var child = new Child(); //有test()
    
  • 借用构造函数 : 得到属性

    function Parent(xxx){
        this.xxx = xxx;
    }
    Parent.prototype.test = function(){};
    function Child(xxx,yyy){
        Parent.call(this, xxx);//借用构造函数   this.Parent(xxx)
    }
    var child = new Child('a', 'b');  //child.xxx为'a', 但child没有test()
    
  • 组合

    function Parent(xxx){
        this.xxx = xxx;
    }
    Parent.prototype.test = function(){};
    function Child(xxx,yyy){
        Parent.call(this, xxx);//借用构造函数   this.Parent(xxx)
    }
    Child.prototype = new Parent(); //得到test()
    var child = new Child(); //child.xxx为'a', 也有test()
    
  • new一个对象背后做了些什么?

    • 创建一个空对象
    • 给对象设置__proto__, 值为构造函数对象的prototype属性值 this.proto = Fn.prototype
    • 执行构造函数体(给对象添加属性/方法)
  • 对象方法

    • Object.defineProperty()定义新属性或修改原有属性。

      Object.definedProperty(obj,prop,descriptor)
      
      • obj:必需。目标对象。
      • prop:必需。需定义或修改的属性名。
      • descriptor:必需。目标属性所拥有的特性,以对象形式书写:
        • value:设置属性的值,默认为undefined
        • writable:值是否可以重写。true | false,默认为false
        • enumerable:目标属性是否可以被枚举(遍历)。true | false,默认为false
        • configurable:目标属性是否可以被删除或是否可以再次修改特性。true | false,默认为false
var obj = {
    name:'张三';
}
Object.definedProperty(obj,'name',{
    value:'李四',
    //不允许修改此属性值
    writable:false,
    //不允许遍历
    enumerable:false,
    //不允许删除此属性
    configurable:false
});
console.log(obj.name);	//李四