面向对象
2018-05-10 本文已影响11人
好奇男孩
JS 中的对象
JS 中的对象是一系列无序 key: value 的集合
比如
var obj = { a: 1, b: 2}
var person = {
name: 'hunger',
sayName: function(){
console.log('My name is hunger')
}
}
我们可以通过 对象.属性来获取对应属性的值
console.log(person.name)
person.sayName()
但假设我们定义一个函数
function sum(a, b){
return a + b
}
console.log(sum.name) // => sum
console.log(sum.length) //2
构造对象
我们可以抛开类,使用字面量来构造一个对象
var obj1 = {
nick: 'Byron',
age: 20,
printName: function(){
console.log(obj1.nick);
}
}
var obj2 = {
nick: 'Casper',
age: 25,
printName: function(){
console.log(obj2.nick);
}
}
问题:
-
太麻烦了,每次构建一个对象都是复制一遍代码
-
如果想个性化,只能通过手工赋值,使用者必需了解对象详细
使用函数做自动化
function createObj(nick, age){
var obj = {
nick: nick,
age: age,
printName: function(){
console.log(this.nick);
}
};
return obj;
}
var obj3 = createObj('Byron', 30);
obj3.printName();
通过创建一个函数来实现自动创建对象的过程,至于个性化通过参数实现,开发者不必关注细节,只需要传入指定参数即可
构造函数
-
任何函数使用new表达式就是构造函数
-
每个函数都自动添加一个名称为
prototype
属性,这是一个对象 -
每个对象都有一个内部属性
__proto__
(规范中没有指定这个名称,但是浏览器都这么实现的) 指向其类型的prototype属性,类的实例也是对象,其__proto__
属性指向“类”的prototype
function Modal(msg){
this.msg = msg
}
var modal = new Modal()
undefined
modal
Modal {msg: undefined}msg: undefined__proto__: Objectconstructor: ƒ Modal(msg)__proto__: Object
modal.msg
undefined
过程:
1.创建了一个空对象{},并把这个空对象的proto指向Modal.prototype.
2.执行函数Modal(),执行过程中对 this 操作就是对 新创建对象 进行操作,未传入传输,可理解为传入值为undefined,然后这个对象的msg :undefined;
3.函数执行完后返回这个对象,然后把这个对象赋值给modal;
instanceof
instanceof是一个操作符,可以判断对象是否为某个类型的实例
modal instanceof Modal( ; // true
modal instanceof Object;// true
instanceof判断的是对象
1 instanceof Number; // false