MDNjavascript面向对象javascript
面向对象里面向的意思是以...为主,面向对象编程既以对象为主的编程.html
面向对象的一些概念:java
Namespace 命名空间
容许开发人员在一个独特, 应用相关的名字的名称下捆绑全部功能的容器。
Class 类
定义对象的特征。它是对象的属性和方法的模板定义.
Object 对象
类的一个实例。
Property 属性
对象的特征,好比颜色。
Method 方法
对象的能力,好比行走。
Constructor 构造函数
对象初始化的瞬间, 被调用的方法. 一般它的名字与包含它的类一致.
例如Object(),String(),Number()
Inheritance 继承
一个类能够继承另外一个类的特征。
Encapsulation 封装
一种把数据和相关的方法绑定在一块儿使用的方法.
Abstraction 抽象
结合复杂的继承,方法,属性的对象可以模拟现实的模型。
Polymorphism 多态
多意为‘许多’,态意为‘形态’。不一样类能够定义相同的方法或属性。git
// 全局命名空间 var MYAPP = MYAPP || {};
javascript命名空间
MYAPP包含了全部的命名,他就像一个房间同样,装着全部的属性,因此就叫命名空间github
// 给普通方法和属性建立一个叫作MYAPP.commonMethod的容器 MYAPP.commonMethod = { regExForName: "", // 定义名字的正则验证 regExForPhone: "", // 定义电话的正则验证 validateName: function(name){ // 对名字name作些操做,你能够经过使用“this.regExForname” // 访问regExForName变量 }, validatePhoneNo: function(phoneNo){ // 对电话号码作操做 } } // 对象和方法一块儿申明 MYAPP.event = { addListener: function(el, type, fn) { // 代码 }, removeListener: function(el, type, fn) { // 代码 }, getEvent: function(e) { // 代码 } // 还能够添加其余的属性和方法 } //使用addListener方法的写法: MYAPP.event.addListener("yourel", "type", callback);
解释:
由于编程
1||2//返回1,不是true或者false!!!
五个falsy值0
NaN
null
undefined
''
segmentfault
在javascript中,a||b
c&&d
的返回值只会在abcd
中选一个!浏览器
且运算符(&&)每每用于多个表达式的求值。
它的运算规则是:若是第一个运算子的布尔值为true, 则返回第二个运算子的值(注意是值,不是布尔值);若是第一个运算子的布尔值为false,则直接返回第一个运算子的值,且再也不对第二个运算子求值。
若是是一连串的&&,他的返回值就是遇到的第一个falsy值,后面的不看了app
1 && 0 && console.log(3)//console.log(3)不会执行,返回0
console.log(3)//返回undefined
而||和&&相反
返回第一个为真的值.后面的不看
那么:
var a = b || {}
意思就是若是b是存在的(b的返回值为true
),那么a=b
,若是b不存在,那么a={}
使用的代码是
模块化、MVC里的V和C、闭包与当即执行函数的使用和MVC中的M(model)、MVC总结
接下来优化老版本的message.js
箭头函数内外this相通
优化前的结构:
在几个模块化文件里,都有MVC
那么咱们能够吧每一个js文件中的MVC写成一个模板,这个模板就是类
所谓模板,就是写个函数把他造出来,那么咱们来封装MVC
首先建三个封装的文件,再引入
原先的model:
封装后Model():
而且save()传入object
而后就能够用封装后的Model()代码了,修改message.js代码为:
也就是说,封装后咱们的使用方法是:
若是有两个model,不须要写重复代码
封装Controller.js,可是没有将封装运用,由于本身的简历项目比较小,代码结构不复杂,封装后反而会难理解,知道如何封装和如何使用的思想就能够
密爱想对象封装后MVC的使用方法:
view:
/* var view = View('.xxx') */
model:
/* var model = Model({ resourceName: '表名' }) */
controller:
/* Controller({ init:(){ this.view this.model this.xxx() this.yyy() }, xxx(){}, yyy(){} }) */
简单了很多.
总结:
面向对象就是既然这些对象有相同的属性和相同的行为,那么就把相同的地方存到一个地方,当作一个模板.这就叫类
当须要生成对象的时候,new一个对象出来,这个对象就有这个模板上的属性和行为.这就叫实例化一个对象.
面向对象的核心就是实例化一个对象
如下引用自MDNjavascript面向对象
若是一个Object的的属性是函数,那么这个属性叫方法
在JavaScript中方法一般是一个绑定到对象中的普通函数, 这意味着方法能够在其所在context以外被调用。 思考下面示例中的代码:
function Person(firstName) { this.firstName = firstName; } Person.prototype.sayHello = function() { alert("Hello, I'm " + this.firstName); }; var person1 = new Person("Alice"); var person2 = new Person("Bob"); var helloFunction = person1.sayHello; person1.sayHello(); // alerts "Hello, I'm Alice" person2.sayHello(); // alerts "Hello, I'm Bob" helloFunction(); // alerts "Hello, I'm undefined" (or fails // with a TypeError in strict mode) console.log(helloFunction === person1.sayHello); // logs true console.log(helloFunction === Person.prototype.sayHello); // logs true helloFunction.call(person1); // logs "Hello, I'm Alice" helloFunction.call(person2); // logs "Hello, I'm Bob"
如上例所示, 全部指向sayHello
函数的引用 ,包括 person1
, Person.prototype
, 和 helloFunction
等, 均引用了相同的函数.
console.log(helloFunction === person1.sayHello); // logs true console.log(helloFunction === Person.prototype.sayHello); // logs true
在调用函数的过程当中,this的值取决于咱们怎么样调用函数. 在一般状况下,咱们经过一个表达式person1.sayHello()
来调用函数:即从一个对象的属性中获得所调用的函数。此时this被设置为咱们取得函数的对象(即person1
)。这就是为何person1.sayHello()
使用了姓名“Alice”而person2.sayHello()
使用了姓名“bob”的缘由。
然而咱们使用不一样的调用方法时, this
的值也就不一样了。当从变量 helloFunction()
中调用的时候, this
就被设置成了全局对象 (在浏览器中即window
)。因为该对象 (很是可能地) 没有firstName
属性, 咱们获得的结果即是"Hello, I'm undefined"
. (这是松散模式下的结果, 在 严格模式中,结果将不一样(此时会产生一个error
)。 可是为了不混淆,咱们在这里不涉及细节) 。另外,咱们能够像上例末尾那样,使用Function#call
(或者Function#apply
)显式的设置this
的值。
本身的理解:call()
的第一个参数就是this
的值.若是没用call
,默认this
是那个调用函数的当前的对象.在全局做用域中,就是被隐藏的window
.因此不写call()
且在全局做用于调用函数的时候,this
就是window
.可使用call()
或者apply
本身指定this
的指向