面向对象
理解:
实际生活中,人使用电脑写文章。
人是一个种类,电脑是一个种类,文章也是一个种类(种类即可理解成程序中的类)。
他们三者各自有自己的一些属性和功能:人有手,头 等等,会用手来使用电脑。电脑能够接收人的指令,去做对应的事情。文章有一些固定的格式,都有标题 ,正文 等等。
当人使用电脑写文章的时候(发生交互的时候),就是使用各个对象上的方法修改属性的过程。
实质上,将程序设计按照现实生活中的规律来进行处理,更加符合人的思考方式,和处理流程,这样就方便编写程序处理事物之前的关系。
在javascript中怎么写一个类呢
方式1:工厂模式
function Person(name, age){
var o = new Object();
o.name = name;
o.age = age;
o.say = function (){
console.log(this.name)
}
return o;
}
var people1 = new Person('xiaming', 10);
工厂模式的问题
- 全部都是实例属性和方法,每一个实例对象都是重新分配内存,公共的方法没有共享(比如say方法)。
- 使用instanceof 无法鉴别出实例是类的实例
people1 instanceof Person // false - people1.constructor // Object
2,3其实都是在说无法看出实例和构造类之间有什么关系
方式2:
构造函数模式
function Person(name ,age){
this.name = name;
this.age = age;
this.say = function (){
console.log(this.name);
}
}
var people1 = new Person('xiaming', 10);
var people2 = new Person('xiaming', 10);
构造函数的
解决了:
- 对象实例和构造类之间关系断层的问题。
people1.constructor// Person
people1 instanceof Person // true
未解决:
- 相同的方法共享(say方法还是独立内存)
people1.say == people2.say// false
方式3:
原型继承+ 构造函数模式
function Person(name,age){
this.name = name ;
this.age = age;
}
Person.prototype.say = function (){
console.log(this.name);
}
var people1 = new Person('xiaming', 10);
var people2 = new Person('xiam', 10);
原型+构造函数解决了
- 相同的方法和属性没有共享的问题
people1.say == people2.say// true