// 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