// 1.对象字面量
let person = {
name: 'xiexk',
age: 18
}
// 2. 对象实例化
let person = new Object()
person.name = 'xiexk'
person.age = 18
// 3.工厂模式
funciton createPerson(name,age,job) {
let o = new Object()
o.name = name;
o.age = age;
o.job = job;
o.sayName = function () {
alert(this.name)
}
}
let person = createPerson('xiexk',18,'programmer')
// 4. 构造函数
function Person(name,age,job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = function () {
alert(this.name)
}
}
let perosn1 = new Person('xiexk'18,'programmer')
let person2 = new Person('kang',18,'programmer')
// 4.原型模式
function Person () {
Person.prototype.name = 'xiexk',
Person.Prototype.age = 18,
Person.prototype.job = 'programmer',
Person.prototype.sayName = function () {
alert(this.name)
}
}
let person1 = new Person();
console.log(person1.sayName())
// 5.组合使用原型模式和构造函数 (经典模式) 最常用
function Person(name,age) {
this.name = name;
this.age = age;
this.friends = ['Shellby', 'Court']
}
Person.prototype = {
constructor: Person,
sayName: function () {
alert(this.name)
}
}
let person1 = new Person('xiexk',18);
let person2 = new Person('Greg',27);
person1.friends.push('Van')
alert(person1.friends); // "Shelby,Count,Van"
alert(person2.friends); // "Shelby,Count"
// 6.动态原型模式
function Person(name,age,job) {
// 属性
this.name = name;
this.age = age;
this.job = job;
// 方法
if(typeof this.sayName != 'function') {
// 这个位置 不要使用对象字面量 重写原型,这样的话 会切断现有实例和新原型之间的联系
Person.prototype.sayName = function () {
alert(this.name)
}
}
}
// 7. 寄生构造函数模式
function SpecialArray() {
let o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function () {
alert(this.name)
}
return o;
}
let friend = new SpecialArray('xiexk',18,'programmer')
friend.sayName(); // 'xiexk'
/* 说明:关于寄生构造函数模式,有一点需要说明:首先,返回的对象与构造函数或者与构造函数的原型
属性之间没有关系;也就是说,构造函数返回的对象与在构造函数外部创建的对象没有什么不同。此不
能依赖 instanceof 操作符来确定对象类型。由于存在上述问题,我们建议在可以使用其他模式的情
况下,不要使用这种模式。*/
// 8. 稳妥构造函数模式
function Person(name,age,job) {
// 创建要返回的对象
let o = new Object();
// 可以在这里定义私有变量和函数
// 添加方法
o.sayName = function () {
alert(name)
}
// 返回对象
return o;
}
let friend = Person('xiexk', 18, 'programmer')
// 与寄生构造函数模式类似,使用稳妥构造函数模式创建的对象与构造函数之间也
// 没有什么关系,因此 instanceof 操作符对这种对象也没有意义