// 创建对象多种方式
//1. 工厂模式
// function createPerson(name) {
// var o = new Object()
// o.name = name
// o.getName = function () {
// console.log(this.name)
// }
// return o
// }
// var person1 = createPerson('zhud')
// console.log(person1)
// person1.getName()
// // 2. 构造函数
// function Person(name) {
// this.name = name
// this.getName = function () {
// console.log(this.name)
// }
// }
// var person2 = new Person('danmei')
// console.log(person2)
// person2.getName()
// // 2.1 构造函数优化?
// function Person(name) {
// this.name = name
// this.getName = getName
// }
// function getName() {
// console.log(this.name)
// }
// var person2 = new Person('danmei')
// console.log(person2)
// // 3. 原型模式
// function Person(name) {
// }
// Person.prototype.name = 'keivn';
// Person.prototype.getName = function () {
// console.log(this.name);
// };
// var person1 = new Person();
// console.log(person1)
// 优点:方法不会重新创建
// 缺点:1. 所有的属性和方法都共享 2. 不能初始化参数
//3.1 原型模式优化
// function Person(name) {
// }
// Person.prototype = {
// name: 'kevin',
// getName: function () {
// console.log(this.name);
// }
// };
// var person1 = new Person();
// console.log(person1)
// 优点:封装性好了一点
// 缺点:重写了原型,丢失了constructor属性
// 3.2 原型模式优化
// function Person(name) {
// }
// Person.prototype = {
// constructor: Person,
// name: 'kevin',
// getName: function () {
// console.log(this.name);
// }
// };
// var person1 = new Person();
// console.log(person1)
// 优点:实例可以通过constructor属性找到所属构造函数
// 缺点:原型模式该有的缺点还是有
// 4.组合模式
// 构造函数模式与原型模式双剑合璧。
// function Person(name) {
// this.name = name
// }
// Person.prototype = {
// constructor: Person,
// getName: function () {
// console.log(this.name);
// }
// }
// var person1 = new Person('jjj');
// console.log('4', person1)
// person1.getName()
// 优点:该共享的共享,该私有的私有,使用最广泛的方式
// 缺点:有的人就是希望全部都写在一起,即更好的封装性
// 动态原型
// function Person(name) {
// this.name = name
// if (typeof this.getName !== "function") {
// Person.prototype.getName = function () {
// this.name = name
// }
// }
// }
// var person1 = new Person('kevin');
// console.log('jjjjj',person1)
function Person(name) {
this.name = name
if (typeof this.getName !== "function") {
Person.prototype = {
constructor: Person,
getName: function () {
console.log(this.name);
}
}
return new Person(name);
}
}
var person1 = new Person('bob');
person1.getName()
var person2 = new Person('daisy');
person2.getName()
// 寄生构造函数模式
function Person(name) {
var o = new Object();
o.name = name;
o.getName = function () {
console.log(this.name);
};
return o;
}
var person1 = new Person('kevin');
console.log(person1 instanceof Person) // false
console.log(person1 instanceof Object) // true
console