SOURCE

// 创建对象多种方式
//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 命令行工具 X clear

                    
>
console