Javascript面向对象。原型与闭包,异步等。
面向对象
不可能少了面向对象,不过JS的和Java、C、C++的太不一样,不得不写一写。
一些注意:
对象的属性值可以是任何的数据类型,也可以是个函数:(也称之为方法)
对象中的属性值,也可以是一个对象。
对象的值是保存在堆内存中的,而对象的引用(即变量)是保存在栈内存中的。如果两个变量保存的是同一个对象引用,当一个通过一个变量修改属性时,另一个也会受到影响。
对象基础
对象的属性、方法的表示法有点表示法和括号表示法两种,区别在于点表示法只能接受字面量的成员的名字,不接受变量作为名字,所以括号表示法不仅可以动态的去设置对象成员的值,还可以动态的去设置成员的名字。
JS的this
,关键字this
指向了当前代码运行时的对象,当使用构造器动态创建对象时,这可以保证代码上下文改变时变量值的正确性。
基于原型
与其他的面向对象语言不太一样,当OOP定义类并以此创建对象实例时,类的属性、方法会被复制到实例中。而JS不进行复制,它通过对象实例与构造器之间的链接,当实例属性被调用,则上溯原型链
,找到对应的属性与方法。
这一链接是__proto__
属性,由构造函数的prototype
属性派生出来的。
类似于其他语言中的“类”。
1 2 3 4 5 6 7 8 9 10 11 12 13
| function Construct(var){ this.var = var; this.reaction = function(){}; }
var example1 = new Construct('hello')
var example2 = new Object();
var example3 = Object.create(example1);
|
函数都有特殊属性:原型prototype
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| function sth(){} sth.prototype.add = "thing"; var sthmore = new sth(); sthmore.prop = "other"; console.log("sth.prototype: " + sth.prototype); console.log("sth.__proto__: " + sth.__proto__); console.log("sth.__proto__.__proto__: " + sth.__proto__.__proto__); console.log("sthmore.prototype: " + sthmore.prototype); console.log("sthmore.__proto__: " + sthmore.__proto__); console.log("sthmore.__proto__.__proto__: " + sthmore.__proto__.__proto__); console.log("sthmore.__proto__.__proto__.__proto__: " + sthmore.__proto__.__proto__.__proto__); console.log("sthmore.prop: " + sthmore.prop); console.log("sthmore.add: " + sthmore.add); console.log("sth.prop: " + sth.prop); console.log("sth.add: " + sth.add); console.log("sth.prototype.prop: " + sth.prototype.prop); console.log("sth.prototype.add: " + sth.prototype.add);
|
先要搞清楚,对象的属性__prototype__
的表现与函数的默认属性prototype
一致,实际上__prototype__
引用了创建该对象的函数(构造函数)的prototype
,不过这个对象属性是一个隐藏属性,一般不被希望使用。有了大致的原型认识,再从对象说起。
函数与对象
感觉前面写得太乱了,写完后面看看要不要删掉前面好了。
在Javascript中,除去值类型(undefined、number、string、boolean)外的一切都是对象。
那么,函数是对象,而对象是由函数创建的。
异步JS