Javascript面向对象

Javascript面向对象

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);

/*
sth.prototype: [object Object]
sth.__proto__: function () { [native code] }
sth.__proto__.__proto__: [object Object]
sthmore.prototype: undefined
sthmore.__proto__: [object Object]
sthmore.__proto__.__proto__: [object Object]
sthmore.__proto__.__proto__.__proto__: null
sthmore.prop: other
sthmore.add: thing
sth.prop: undefined
sth.add: undefined
sth.prototype.prop: undefined
sth.prototype.add: thing
*/

先要搞清楚,对象的属性__prototype__的表现与函数的默认属性prototype一致,实际上__prototype__引用了创建该对象的函数(构造函数)的prototype,不过这个对象属性是一个隐藏属性,一般不被希望使用。有了大致的原型认识,再从对象说起。

函数与对象

感觉前面写得太乱了,写完后面看看要不要删掉前面好了。

在Javascript中,除去值类型(undefined、number、string、boolean)外的一切都是对象。

那么,函数是对象,而对象是由函数创建的

异步JS

作者

ivy

发布于

2019-10-15

更新于

2023-03-25

许可协议

CC BY-NC-SA 4.0

评论