js创建对象模式与继承方式小结
创建js对象必须知道的4种方法#
欢迎指正!
-
工厂模式
简单说明:通过函数中创建新的对象,赋予属性后,再返回该对象。该方法一般不适用
function sayName() { console.log(this.name); } function Person1 (name, age) { var obj = new Object(); obj.name = name; obj.age = age; obj.sayName = sayName; return obj; } var person1 = Person1('susan', 21); person1.sayName();
-
构造函数模式
简单说明:无需在函数中创建对象而使用this指代,且无需返回
function Person2 (name, age) { this.name = name; this.age = age; this.sayName = sayName; } var person2 = new Person2('susan', 21); person2.sayName();
-
原型模式
在函数中不对属性进行定义,而是使用prototype属性进行定义
function Person3 () {} Person3.prototype.name = 'susan'; Person3.prototype.age = 21; Person3.prototype.sayName = sayName; var person3 = new Person3(); person3.sayName();
-
混合构造函数模式与原型模式(推荐)
该方法集合了两种模式的优点,既可以做到对象拥有私有属性,又可以公用其中的一些方法
function Person4 (name, age) { this.name = name; this.age = age; } Person4.prototype.sayName = sayName; var person4 = new Person4('susan', 21); person4.sayName();
js继承必须知道的4种方法
-
原型链继承。
简单说明:子类的原型对象为基类的实例函数
(function () { function SuperType() { this.property = true; this.exist = 'yes'; } SuperType.prototype.getSuperValue = function () { return this.property; } function SubType() { this.subproperty = false; } //继承SuperType SubType.prototype = new SuperType(); //避免使用字面量方法设置 SuperType.prototype.getSubValue = function () { return this.subproperty; } var instance = new SubType(); console.log(instance.getSuperValue()); //true }());
-
构造函数继承
在子类中使用call/apply调用父类
(function () { function SuperType() { this.colors = ['red', 'blue', 'pink']; } function SubType() { SuperType.call(this); } var instance1 = new SubType(); instance1.colors.push('black'); console.log(instance1.colors); //["red", "blue", "pink", "black"] var instance2 = new SubType(); console.log(instance2.colors); //["red", "blue", "pink"] }());
-
原型式继承
使用Object.create(),返回的新对象以括号内的对象为原型,其中可以对私有属性进行更改,而方法也得到了公用。不足点在于当数据为数组时,会共享这个数组。
var sub = Object.create(person); sub.name = 'jack'; sub.colors.push('white'); console.log(sub.name); //jack var subs = Object.create(person); subs.name = 'jan'; subs.colors.push('pink'); console.log(subs.name); //jan console.log(subs.colors); //["red", "black", "white", "pink"]
-
拷贝继承
拷贝一个对象的所有属性和方法,缺点是无法获取基类不能枚举的属性
function Animal () { this.name = 'susan'; this.age = 21; this.sayName = function () { console.log(this.name); } } Animal.prototype.sayAge = function () { console.log(this.age); } function Cat () { var animal = new Animal(); for (var p in animal) { Cat.prototype[p] = animal[p]; } } Cat.prototype.sayHi = function () { console.log('hi'); } var cat = new Cat(); cat.sayAge(); //21 cat.sayName(); //susan cat.sayHi(); //hi