创建对象
一、js中的面向对象
- 其他语言中(如java)是依靠类和实例这两个人概念来实现面向对象的编程的
- JavaScript不区分类和实例的概念,而是通过原型
prototype
来实现面向对象编程
- java 本质是通过类模版来创建不同的实例对象,而js中一切皆对象,是通过对象来创建对象
简单面向对象的实现
var Student = {
name: 'Robot',
height: 1.2,
run: function () {
console.log(this.name + ' is running...');
}
};
function createStudent(name) {
var s = Object.create(Student);
s.name = name;
return s;
}
var xiaoming = createStudent('小明');
xiaoming.run();
xiaoming.__proto__ === Student;
二、使用构造函数创建对象
1、构造函数
- 构造函数就是一个普通的函数,不过使用的方法比较特殊
- 不写new就是一个普通函数,它返回undefined
- 写了new就变成了一个构造函数,它绑定的this指向新创建的对象,并默认返回this
function Student(name) {
this.name = name;
this.hello = function () {
alert('Hello, ' + this.name + '!');
}
}
var xiaoming = new Student('小明');
xiaoming.name;
xiaoming.hello();
2、prototype & constructor
- 创建一个函数A,浏览器就会在内存中对应创建一个对象B,函数A的 prototype 属性指向对象B
- 这个对象B就是函数A的原型对象,简称函数的原型
- 这个原型对象B 默认会有一个属性 constructor 指向了这个函数A
- 可以为函数的 prototype 属性指定新的对象来作为原型,这样做的问题就是新对象的constructor属性则不再指向该构造函数了
3、__proto__
- 通过构造函数创建的对象没有prototype这个属性,不过可以用
__proto__
这个非标准用法来查看构造函数的原型对象
hasOwnProperty
方法和in
操作符
- hasOwnProperty判断属性是不是对象特有的,属性不存在或者存在于原型链中都会返回false
- in 操作符只要属性存在,无论是对象特有还是原型链中的都返回true
- 存在于原型中的属性判断:in 返回true,hasOwnProperty返回false
4、JS对象创建的最佳实践
- 构造函数加属性(特有),原型(prototype)加方法(共有);
function CreatePerson(name, qq)
{
this.name=name;
this.qq=qq;
}
CreatePerson.prototype.showName=function ()
{
alert('我的名字叫:'+this.name);
};
CreatePerson.prototype.showQQ=function ()
{
alert('我的QQ号:'+this.qq);
};
var obj=new CreatePerson('blue', '258248832');
var obj2=new CreatePerson('张三', '45648979879');
- 上诉代码的缺陷在于方法和属性还是分离的,封装性还不够好,可以使用如下代码改进
- 改进代码的特点就是第一次通过构造函数创建对象的时候会自动通过原型添加方法
function CreatePerson(name, qq)
{
this.name