SOURCE

// console.log(JSON.stringify('aa'))

function mconsole (...args) {
    console.log(JSON.stringify([...args]))
}

// mconsole('a', 'v', 'w', {a: 1, b: {c: 1}})
// 1.工厂模式
function createPerson(name, age, job) {
    var o = new Object()
    o.name = name
    o.age = age
    o.job = job
    return o
}

var person1 = createPerson('张飞', 18, '屠夫')
mconsole(person1)

// 2.构造函数模式 区别的是,需要使用new 关键字来创建对象而不是执行函数
function Person4(name, age, job) {
    this.name = name
    this.age = age
    this.job = job
}
var p4 = new Person4('曹操', 23, '丞相')
var p41 = new Person4('夏侯淳', 24, '将军')
mconsole('p4', p4, p41, p4.constructor == Person4)


// 3.原型模式
function Person5() {}
// Person5.prototype.name = '张三的原型'
// Person5.prototype.age = 19
// Person5.prototype.job = '屠夫的原型'
Person5.prototype = { 
    // 注意,这种写法,所创建的实例的constructor不再指向Person5
    // 若需要p5.constructor == Person5 为true,则需要指定如下值
    // constructor : Person5, 但这种写法,constructor可以枚举,所以
    // 可以使用Object.defineProperty来设置constructor
    name: '张三的原型',
    age: 11,
    job: '屠夫的原型'
}

let p5 = new Person5()
p5.name = '张三'
p5.start = 2
mconsole('p5', p5.name, Object.getPrototypeOf(p5), "name" in p5,
p5.hasOwnProperty( 'name'), Object.keys(p5),
Object.getOwnPropertyNames(Person5.prototype),
)
// 用for in 可以遍历对象和其原型中可枚举的属性


// es6的写法
class Person {
    constructor(name, age, job) {
        this.name = name
        this.age = age
        this.job = job
    }
}
var person2 = new Person('关羽', 20, '武圣')
mconsole(person2)

class Chinese extends Person {
    constructor(name, age, job, start) {
        super(name, age, job)
        this.start = start
    }
}
var person3 = new Chinese('刘备', 22, '大耳', 5)
mconsole(person3)
console 命令行工具 X clear

                    
>
console