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); //李四