理解对象是一些拥有属性和方法的函数,这些对象对于描述逻辑事务非常重要。U6j易塔云建站-模板下载,web开发资源,技术博客
我认为对象就是一个大括号(没有更大的括号了),无需过度抽象化。U6j易塔云建站-模板下载,web开发资源,技术博客
工厂模式(是软件设计领域共知方法):
/**工厂模式**/U6j易塔云建站-模板下载,web开发资源,技术博客
function createPerson(name,age,job){U6j易塔云建站-模板下载,web开发资源,技术博客
var obj = new Object();U6j易塔云建站-模板下载,web开发资源,技术博客
obj.name = name;U6j易塔云建站-模板下载,web开发资源,技术博客
obj.job = job;U6j易塔云建站-模板下载,web开发资源,技术博客
obj.age = age;U6j易塔云建站-模板下载,web开发资源,技术博客
obj.sayHey = function(){U6j易塔云建站-模板下载,web开发资源,技术博客
alert(this.name)U6j易塔云建站-模板下载,web开发资源,技术博客
};U6j易塔云建站-模板下载,web开发资源,技术博客
return obj;U6j易塔云建站-模板下载,web开发资源,技术博客
}U6j易塔云建站-模板下载,web开发资源,技术博客
var person1 = createPerson("red",23,"hhh");U6j易塔云建站-模板下载,web开发资源,技术博客
person1.sayHey();U6j易塔云建站-模板下载,web开发资源,技术博客
//调用后会返回一个包含3个属性+一个方法的对象。
/*工厂模式中,不给出this,内部声明,并数据化,需带return返回*/U6j易塔云建站-模板下载,web开发资源,技术博客
function makePlayer(name,totalScore,gamesPlayed){U6j易塔云建站-模板下载,web开发资源,技术博客
var obj = {};U6j易塔云建站-模板下载,web开发资源,技术博客
obj.name = name;U6j易塔云建站-模板下载,web开发资源,技术博客
obj.totalScore = totalScore;U6j易塔云建站-模板下载,web开发资源,技术博客
obj.gamesPlayed = gamesPlayed;U6j易塔云建站-模板下载,web开发资源,技术博客
return obj;U6j易塔云建站-模板下载,web开发资源,技术博客
//不加return 就是普通函数,普通函数没有返回语句U6j易塔云建站-模板下载,web开发资源,技术博客
//那下面的函数调用,就没结果U6j易塔云建站-模板下载,web开发资源,技术博客
}U6j易塔云建站-模板下载,web开发资源,技术博客
var person = makePlayer("red",90,"yes");U6j易塔云建站-模板下载,web开发资源,技术博客
console.log(person.name);
后来演变为构造函数模式,也就是现在经常用的。
/*构造函数模式U6j易塔云建站-模板下载,web开发资源,技术博客
* 带new操作符U6j易塔云建站-模板下载,web开发资源,技术博客
* 首字母大写U6j易塔云建站-模板下载,web开发资源,技术博客
* 函数内部不带return语句U6j易塔云建站-模板下载,web开发资源,技术博客
* PS:相对于普通函数,构造函数中的this是指向实例的,而普通函数调用中的this是指向window的。U6j易塔云建站-模板下载,web开发资源,技术博客
*/U6j易塔云建站-模板下载,web开发资源,技术博客
//Object Array,元素构造函数,在运行时会自动出现在执行环境中。U6j易塔云建站-模板下载,web开发资源,技术博客
function Person(name,age,job){U6j易塔云建站-模板下载,web开发资源,技术博客
this.name = name;U6j易塔云建站-模板下载,web开发资源,技术博客
this.age = age;U6j易塔云建站-模板下载,web开发资源,技术博客
this.job = job;U6j易塔云建站-模板下载,web开发资源,技术博客
this.sayHey = function(){U6j易塔云建站-模板下载,web开发资源,技术博客
alert("你好,我是:" + this.name + "!")U6j易塔云建站-模板下载,web开发资源,技术博客
}U6j易塔云建站-模板下载,web开发资源,技术博客
// console.log(this);U6j易塔云建站-模板下载,web开发资源,技术博客
}U6j易塔云建站-模板下载,web开发资源,技术博客
// console.log(Person);U6j易塔云建站-模板下载,web开发资源,技术博客
var person1 = new Person("red",23,"hhh");
如何理解 new 这个过程?
//new一个对象的过程拆解:U6j易塔云建站-模板下载,web开发资源,技术博客
/*拆解过程分四步:U6j易塔云建站-模板下载,web开发资源,技术博客
* 1,创建一个空对象objU6j易塔云建站-模板下载,web开发资源,技术博客
* 2-1,将这个空对象的 __proto__ 成员指向了构造函数对象的 prototype 成员对象U6j易塔云建站-模板下载,web开发资源,技术博客
* 2-2,将构造函数的作用域赋给空对象,因此构造函数的this指向新对象obj,然后再调用构造函数。U6j易塔云建站-模板下载,web开发资源,技术博客
* 3,执行你的数据操作,工厂模式或对象字面量方式赋值。U6j易塔云建站-模板下载,web开发资源,技术博客
* 4,返回这个对象。U6j易塔云建站-模板下载,web开发资源,技术博客
*/U6j易塔云建站-模板下载,web开发资源,技术博客
//俗称工厂模式拆解U6j易塔云建站-模板下载,web开发资源,技术博客
function anotherObj(){U6j易塔云建站-模板下载,web开发资源,技术博客
//创建空对象;U6j易塔云建站-模板下载,web开发资源,技术博客
var otherPerson = {};U6j易塔云建站-模板下载,web开发资源,技术博客
//将空对象的 __proto__ 指向构造函数的 prototype 成员对象U6j易塔云建站-模板下载,web开发资源,技术博客
otherPerson.__proto__ = Person.prototype; U6j易塔云建站-模板下载,web开发资源,技术博客
//延长实例的作用域至构造函数,此时的构造函数this指针,指向着这个实例。新对象也就有了这些属性和方法U6j易塔云建站-模板下载,web开发资源,技术博客
Person.call(otherPerson);U6j易塔云建站-模板下载,web开发资源,技术博客
//将otherPerson对象数据 调用 Person构造函数属性和方法 并赋值U6j易塔云建站-模板下载,web开发资源,技术博客
otherPerson.name = "red";//执行构造函数中的代码U6j易塔云建站-模板下载,web开发资源,技术博客
otherPerson.age = 23;//这一部分在根据Person构造器中的属性,添加对应实例U6j易塔云建站-模板下载,web开发资源,技术博客
otherPerson.job = "hhh";//如果你不写sayHey,也会默认添加U6j易塔云建站-模板下载,web开发资源,技术博客
//就像工厂模式一样,需要返回一个新对象U6j易塔云建站-模板下载,web开发资源,技术博客
return otherPerson;U6j易塔云建站-模板下载,web开发资源,技术博客
}U6j易塔云建站-模板下载,web开发资源,技术博客
anotherObj();U6j易塔云建站-模板下载,web开发资源,技术博客
//结束U6j易塔云建站-模板下载,web开发资源,技术博客
var person2 = anotherObj();U6j易塔云建站-模板下载,web开发资源,技术博客
console.log(person1);U6j易塔云建站-模板下载,web开发资源,技术博客
// console.log(person2);U6j易塔云建站-模板下载,web开发资源,技术博客
// console.log(person1.constructor == Person);//trueU6j易塔云建站-模板下载,web开发资源,技术博客
// console.log(person2.constructor == Person);//依然是 true
以上是本笔记的精华,最后涉及到一个概念:实例的__proto__ 是 何时或怎么又为何 指向 构造函数的 prototype ,后期继续为大家分享学习成果。