日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JavaScript基于对象编程

發布時間:2023/12/9 javascript 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript基于对象编程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

JavaScript基于對象編程

1、JavaScript變量/函數聲明在代碼執行之前被解析,并且變量聲明優先級高于函數聲明。

代碼片段:

1

2

3

4

5

6

7

var? ?flag =? ?'test'? ?in? ?window;

if? ?(!flag){

????? ?var? ?test = 1;

}

?

new? ?StringBuffer(? ?'test = '? ?).append(test).toString();

執行結果:

test?=?undefined

2、JavaScript中的this關鍵字指向當前執行上下文對象。

代碼片段:

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

var? ?_this =? ?this? ?;

var? ?id;

var? ?name;

function? ?User(){

????? ?id = 110;

????? ?this? ?.name =? ?'andy'? ?;

????? ?return? ?this? ?;

}

?

var? ?userOject =? ?new? ?User();

var? ?_new_id = id;

var? ?_new_name = name;

var? ?_obj_id = userOject.id;

var? ?_obj_name = userOject.name;

?

var? ?userFunc = User();

var? ?_id = id;

var? ?_name = name;

var? ?_func_id = userFunc.id;

var? ?_func_name = userFunc.name;

?

?

new? ?StringBuffer(? ?'_this = '? ?).append( _this ).

append(? ?';userOject = '? ?).append(userOject ).append(? ?';_new_id = '? ?).append(_new_id).append(? ?';_new_name = '? ?).append(_new_name ).

append(? ?';_obj_id = '? ?).append(_obj_id ).append(? ?';_obj_name = '? ?).append( _obj_name ).

append(? ?';userFunc = '? ?).append(userFunc ).append(? ?';_id = '? ?).append(_id ).append(? ?';_name = '? ?).append(_name).

append(? ?';_func_id = '? ?).append(_func_id ).append(? ?';_func_name = '? ?).append( _func_name).toString();

執行結果:

_this?=?[object?Window] userOject?=?[object?Object] _new_id?=?110 _new_name?=?undefined _obj_id?=?undefined _obj_name?=?andy userFunc?=?[object?Window] _id?=?110 _name?=?andy _func_id?=?110 _func_name?=?andy

3、JavaScript中通過new關鍵字調用的函數才是構造函數。(在構造函數內部 - 也就是被調用的函數內 - this 指向新創建的對象 Object。)

代碼片段:

1

2

3

4

5

6

7

8

9

10

11

12

function? ?User(userName){

????? ?this? ?.userName = userName;

????? ?return? ?this? ?;

}

var? ?zhengwei = User(? ?'鄭偉'? ?);

var? ?andy =? ?new? ?User(? ?'andy'? ?);

?

new? ?StringBuffer(? ?'zhengwei.constructor = '? ?).append(zhengwei.constructor).

append(? ?';zhengwei instanceof User ='? ?).append((zhengwei? ?instanceof? ?User)).

append(? ?';andy.constructor = '? ?).append(andy.constructor).

append(? ?';andy instanceof User = '? ?).append((andy? ?instanceof? ?User)).toString();

執行結果:

zhengwei.constructor?=?[object?Window] zhengwei?instanceof?User?=false andy.constructor?=?function?User(userName){this.userName?=?userNamereturn?this} andy?instanceof?User?=?true

4、JavaScript中所有變量都是對象,除了兩個例外 null 和 undefined。

代碼片段:

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

var? ?undefind_test =? ?'undefind'? ?in? ?window;

var? ?null_test =? ?'null'? ?in? ?window;

var? ?_undefind =? ?null? ?;

?

var? ?undefind_toString;

try? ?{

????? ?undefind_toString = undefind.toString();

}? ?catch? ?(e){

????? ?undefind_toString = e;

}

?

var? ?null_toString;

try? ?{

????? ?null_toString =? ?null? ?.toString();

}? ?catch? ?(e){

????? ?null_toString = e;

}

?

var? ?boolean_toString =? ?false? ?.toString();

var? ?number_toString = (2..toString() || 2 .toString() || (2).toString());

var? ?array_toString = [1,2,3].toString();

?

new? ?StringBuffer(? ?'undefind_test = '? ?).append(undefind_test).

append(? ?';null_test = '? ?).append( null_test).

append(? ?';_undefind = '? ?).append(_undefind).

append(? ?';undefind_toString = '? ?).append(undefind_toString).

append(? ?';null_toString = '? ?).append(null_toString).

append(? ?';boolean_toString = '? ?).append(boolean_toString).

append(? ?';number_toString = '? ?).append(number_toString).

append(? ?';array_toString = '? ?).append(array_toString).toString();

執行結果:

undefind_test?=?false null_test?=?false _undefind?=?null undefind_toString?=?ReferenceError:?undefind?is?not?defined null_toString?=?TypeError:?null?has?no?properties boolean_toString?=?false number_toString?=?2 array_toString?=?1,2,3

5、JavaScript的對象可以作為哈希表使用,主要用來保存命名的鍵與值的對應關系。使用對象的字面語法 - {} - 可以創建一個簡單對象。這個新創建的對象從 Object.prototype 繼承。

代碼片段:

1

2

3

4

5

6

7

8

9

10

var? ?Person = {id :? ?'001'? ?, userName :? ?'鄭偉'? ?};

Person.age = 28;

?

new? ?StringBuffer(? ?"Person = "? ?).append(Person).

append(? ?";Person.constructor = "? ?).append(Person.constructor).

append(? ?";(Person instanceof Object) = "? ?).append((Person? ?instanceof? ?Object)).

append(? ?";Person['id'] = "? ?).append(Person[? ?'id'? ?]).

append(? ?";Person.userName = "? ?).append(Person.userName).

append(? ?";Person['age'] = "? ?).append(Person[? ?'age'? ?]).toString();

執行結果:

Person?=?[object?Object] Person.constructor?=?function?Object()?{[native?code] } (Person?instanceof?Object)?=?true Person['id']?=?001 Person.userName?=?鄭偉 Person['age']?=?28

6、JavaScript原型屬性。(基于原型模型實現繼承的對象最終形成原型鏈,新創建的對象的 prototype 被指向到構造函數的 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

34

35

36

var? ?Person =? ?function? ?(){};

Person.prototype =? ?new? ?Object();

// early binding -- Class template

Person.prototype.id =? ?'001'? ?;

Person.prototype.userName =? ?'鄭偉'? ?;

Person.prototype.age = 28;

Person.prototype.say =? ?function? ?(){

????? ?return? ?"[id = "? ?+? ?this? ?.id +? ?", userName = "? ?+? ?this? ?.userName +? ?",age = "? ?+? ?this? ?.age +? ?"]"? ?;

}

?

var? ?person =? ?new? ?Person();

// later binding -- Instance template

/*person.id = '001'

person.userName = '鄭偉';

person.age = 28;

person.say = function(){

????? ?return "[id = " + this.id + ", userName = " + this.userName + ",age = " + this.age + "]";

}*/

var? ?_prototype_toString =? ?new? ?StringBuffer();

var? ?count = -1;

for? ?(? ?var? ?n? ?in? ?Person.prototype) {

????? ?if? ?(count >= 0){

????????? ?_prototype_toString.append(? ?","? ?);

????? ?}

????? ?_prototype_toString.append(n).append(? ?"="? ?).append(Person.prototype[n]);

????? ?count ++;

}

?

new? ?StringBuffer(? ?'Object.prototype = '? ?).append(Object.prototype).

append(? ?';Object.constructor = '? ?).append(Object.constructor).

append(? ?';Object.prototype.constructor = '? ?).append(Object.prototype.constructor).

append(? ?';(person instanceof Object) = '? ?).append((Person? ?instanceof? ?Object)).

append(? ?';person.constructor = '? ?).append(Person.constructor).

append(? ?";person.say() = "? ?).append(person.say()).

append(? ?";_prototype_toString = "? ?).append(_prototype_toString.toString()).toString();

執行結果:

Object.prototype?=?[object?Object] Object.constructor?=?function?Function()?{[native?code] } Object.prototype.constructor?=?function?Object()?{[native?code] } (person?instanceof?Object)?=?true person.constructor?=?function?Function()?{[native?code] } person.say()?=?[id?=?001,?userName?=?鄭偉,age?=?28] _prototype_toString?=?id=001,userName=鄭偉,age=28,say=function?(){return?"[id?=?"?+?this.id?+?",?userName?=?"?+?this.userName?+?",age?=?"?+?this.age?+?"]"}

7、基于構造函數(對象冒充)實現JavaScript對象繼承。(支持多重繼承,不支持instanceof關鍵字,多層繼承時調用層次過多)

代碼片段:

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

// Define baseClass.

function? ?BaseClass(id, name){

????? ?this? ?.id = id;

????? ?this? ?.name = name;

????? ?this? ?.toString =? ?function? ?(){

????????? ?return? ?'id = '? ?+? ?this? ?.id +? ?', name ='? ?+? ?this? ?.name;

????? ?};

}

?

?

// Define subclass.

function? ?SubClass(){

????? ?BaseClass.apply(? ?this? ?, arguments);

????? ?this? ?.identifer = arguments[arguments.length - 1];

????? ?this? ?.toString =? ?function? ?(){

????????? ?return? ?BaseClass.prototype.toString.call(? ?this? ?) +? ?', identifer = '? ?+? ?this? ?.identifer;

????? ?};

}

?

var? ?subClass =? ?new? ?SubClass(1,? ?'subClass'? ?,? ?'0001'? ?);

?

new? ?StringBuffer(? ?'subClass.toString() = '? ?).append(subClass.toString()).

append(? ?';subClass.constructor = '? ?).append(subClass.constructor).

append(? ?';(subClass.constructor? === SubClass) = '? ?).append((subClass.constructor? === SubClass)).

append(? ?';(subClass instanceof SubClass) = '? ?).append((subClass? ?instanceof? ?SubClass)).

append(? ?';(subClass instanceof BaseClass) = '? ?).append((subClass? ?instanceof? ?BaseClass)).toString();

執行結果:

subClass.toString()?=?[object?Object],?identifer?=?0001 subClass.constructor?=?function?SubClass(){BaseClass.apply(this,?arguments)this.identifer?=?arguments[arguments.length?-?1]this.toString?=?function(){return?BaseClass.prototype.toString.call(this)?+?',?identifer?=?'?+?this.identifer}} (subClass.constructor??===?SubClass)?=?true (subClass?instanceof?SubClass)?=?true (subClass?instanceof?BaseClass)?=?false

8、基于原型(代碼模板)實現JavaScript對象繼承。(不支持多重繼承,支持instanceof關鍵字,多層繼承時模版復用)

代碼片段:

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

// Define baseClass

function? ?BaseClass(){}

BaseClass.prototype.id =? ?null? ?;

BaseClass.prototype.name =? ?null? ?;

BaseClass.prototype.toString =? ?function? ?(){

????? ?return? ?'id = '? ?+? ?this? ?.id +? ?', name ='? ?+? ?this? ?.name;

};

?

?

// Define subClass

function? ?SubClass(){}

SubClass.prototype =? ?new? ?BaseClass();

?

SubClass.prototype.identifer =? ?null? ?;

SubClass.prototype.toString =? ?function? ?(){

????? ?return? ?BaseClass.prototype.toString.call(? ?this? ?) +? ?', identifer = '? ?+? ?this? ?.identifer;

};

?

// The subclass is instanced.

var? ?subClass =? ?new? ?SubClass();

subClass.id = 1;

subClass.name =? ?'subClass'? ?;

subClass.identifer =? ?'0001'? ?;

?

// Output

new? ?StringBuffer(? ?'subClass.toString() = '? ?).append(subClass.toString()).

append(? ?';subClass.constructor = '? ?).append(subClass.constructor).

append(? ?';(subClass.constructor? === SubClass) ='? ?).append((subClass.constructor? === SubClass)).

append(? ?';(subClass instanceof SubClass) = '? ?).append((subClass? ?instanceof? ?SubClass)).

append(? ?';(subClass instanceof BaseClass) = '? ?).append((subClass? ?instanceof? ?BaseClass)).toString();

執行結果:

subClass.toString()?=?id?=?1,?name?=subClass,?identifer?=?0001 subClass.constructor?=?function?BaseClass(){} (subClass.constructor??===?SubClass)?=false (subClass?instanceof?SubClass)?=?true (subClass?instanceof?BaseClass)?=?true

9、基于 構造函數(封裝類屬性-成員變量) + 原型 (封裝類行為-方法)實現JavaScript對象繼承。(不支持多重繼承,支持instanceof關鍵字,多層繼承時模版復用)

代碼片段:

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

// Define baseclass.

function? ?BaseClass(id, name){

????? ?this? ?.id = id;

????? ?this? ?.name = name;

}

// Overwrite toString method.

BaseClass.prototype.toString =? ?function? ?(){

????? ?return? ?'id = '? ?+? ?this? ?.id +? ?', name ='? ?+? ?this? ?.name;

};

?????

?

// Define subclass.

function? ?SubClass(){

????? ?BaseClass.apply(? ?this? ?, arguments);

????? ?this? ?.identifer = arguments[arguments.length - 1];

}

// Subclass extends base class.

SubClass.prototype =? ?new? ?BaseClass();

SubClass.prototype.constructor = SubClass;

SubClass.prototype.toString =? ?function? ?(){

????? ?return? ?BaseClass.prototype.toString.call(? ?this? ?) +? ?', identifer = '? ?+? ?this? ?.identifer;

};

?????????

// The subclass is intanced.

var? ?subClass =? ?new? ?SubClass(1,? ?'subClass'? ?,? ?'0001'? ?);

?

// Output

new? ?StringBuffer(? ?'subClass.toString() = '? ?).append(subClass.toString()).

append(? ?';subClass.constructor = '? ?).append(subClass.constructor).

append(? ?';(subClass.constructor? === SubClass) ='? ?).append((subClass.constructor? === SubClass)).

append(? ?';(subClass instanceof SubClass) = '? ?).append((subClass? ?instanceof? ?SubClass)).

append(? ?';(subClass instanceof BaseClass) = '? ?).append((subClass? ?instanceof? ?BaseClass)).toString();

執行結果:

subClass.toString()?=?id?=?1,?name?=subClass,?identifer?=?0001 subClass.constructor?=?function?SubClass(){BaseClass.apply(this,?arguments)this.identifer?=?arguments[arguments.length?-?1]} (subClass.constructor??===?SubClass)?=true (subClass?instanceof?SubClass)?=?true (subClass?instanceof?BaseClass)?=?true

10、基于 對象結構(哈希表key-value)實現JavaScript對象繼承。(支持多重繼承,不支持instanceof關鍵字,多層繼承時模版迭代)

代碼片段:

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

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

// Define class factory.

var? ?ClassFactory = {

????? ?createClass :? ?function? ?(){

????????? ?// To defind the current constructor.

????????? ?var? ?CurrentClass =? ?function? ?(){};

????????? ?// Agreed the final parameter for the current class extends the prototype, for the rest of the parameters so as to realize the parent class.

????????? ?var? ?extendsPrototype = arguments[arguments.length - 1] || {};

????????? ?for? ?(? ?var? ?i? ?in? ?arguments){

????????????? ?if? ?(i == arguments.length - 1)? ?break? ?;

????????????? ?var? ?superClass = arguments[i];

????????????? ?var? ?ordinal = superClass.ORDINAL = i;

????????????? ?if? ?(? ?'function'? ?===? ?typeof? ?(superClass)){

????????????????? ?superClass = superClass.prototype;

????????????? ?}

????????????? ?var? ?superPrototype = extendsPrototype[ordinal] = {};

????????????? ?for? ?(? ?var? ?key? ?in? ?superClass) {

????????????????? ?// Determine whether the current members of the current class

????????????????? ?if? ?(superClass.hasOwnProperty(key)){

????????????????????? ?superPrototype[key] = superClass[key];

????????????????? ?}? ?else? ?{

????????????????????? ?extendsPrototype[key] = superClass[key];

????????????????? ?}

????????????? ?}

????????? ?}

?????????

????????? ?// Prototype will expand after the prototype chain of pointing to the current class.

????????? ?CurrentClass.prototype = extendsPrototype;

????????? ?CurrentClass.prototype.constructor = CurrentClass;

????????? ?return? ?CurrentClass;

????? ?}

};

// Define class A

var? ?A = ClassFactory.createClass({

????? ?width : 100,

????? ?getWidth :? ?function? ?(){

????????? ?return? ?this? ?.width;

????? ?}

});

?

// Define class B

var? ?B = ClassFactory.createClass({

????? ?width : 200,

????? ?height : 100,

????? ?getWidth :? ?function? ?(){

????????? ?return? ?this? ?.width;

????? ?},

????? ?getHeight :? ?function? ?(){

????????? ?return? ?this? ?.height;

????? ?}

});

?

// Define class C

var? ?C = ClassFactory.createClass(A, B,{

????? ?width : 300,

????? ?getWidth :? ?function? ?(){

????????? ?return? ?this? ?.width;

????? ?}

});

?

// Initialize C object

var? ?c =? ?new? ?C();

?

// Output

new? ?StringBuffer(? ?'c.constructor = '? ?).append(c.constructor).

append(? ?';(c.constructor === C) = '? ?).append((c.constructor === C)).

append(? ?';(c instanceof C) = '? ?).append((c? ?instanceof? ?C)).

append(? ?';((c instanceof A) || (c instanceof B)) = '? ?).append(((c? ?instanceof? ?A) || (c? ?instanceof? ?B))).

append(? ?';c.getWidth() = '? ?).append(c.getWidth()).

append(? ?';c[A.ORDINAL].getWidth() = '? ?).append(? ?(c[A.ORDINAL]).getWidth()? ?).

append(? ?';c[B.ORDINAL].getWidth() = '? ?).append(? ?(c[B.ORDINAL]).getWidth()? ?).

append(? ?';c[B.ORDINAL].getHeight() = '? ?).append(? ?(c[B.ORDINAL]).getHeight()? ?).toString();

執行結果:

c.constructor?=?function?(){} (c.constructor?===?C)?=?true (c?instanceof?C)?=?true ((c?instanceof?A)?||?(c?instanceof?B))?=?false c.getWidth()?=?300 c[A.ORDINAL].getWidth()?=?100 c[B.ORDINAL].getWidth()?=?200 c[B.ORDINAL].getHeight()?=?100

11、基于 構造函數(封裝類屬性-成員變量) + 原型 (封裝類行為-方法)實現JavaScript對象繼承推薦寫法。(不支持多重繼承,支持instanceof關鍵字,多層繼承時模版復用)

代碼片段:

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

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

// Define class factory.

var? ?ClassFactory = {

????? ?createClass :? ?function? ?(){

????????? ?// To defind the current constructor.

????????? ?// TODO set member Variables

????????? ?var? ?CurrentClass =? ?function? ?(){

????????????? ?if? ?(? ?this? ?.initialize){

????????????????? ?this? ?.initialize.apply(? ?this? ?, arguments);

????????????? ?}

????????? ?};

????????? ?// The current class to extends base class.

????????? ?var? ?SuperClass = arguments[0] ||? ?''? ?;

????????? ?if? ?(? ?typeof? ?(SuperClass) ===? ?'function'? ?){

????????????? ?CurrentClass.prototype =? ?new? ?SuperClass();

????????? ?}? ?else? ?{

????????????? ?// If current class is base class, then current class prototype direct at Object prototype.

????????????? ?CurrentClass.prototype =? ?new? ?Object();

????????? ?}

????????? ?CurrentClass.prototype.constructor = CurrentClass;

?????????

????????? ?// The current class to extend prototype.

????????? ?var? ?extendsPrototype = arguments[arguments.length - 1] || {};

????????? ?for? ?(? ?var? ?key? ?in? ?extendsPrototype){

????????????? ?CurrentClass.prototype[key] = extendsPrototype[key];

????????? ?}

?????????

????????? ?return? ?CurrentClass;

????? ?}

}

// Define base class.

var? ?SuperComponent = ClassFactory.createClass({

????? ?initialize :? ?function? ?(title, index){

????????? ?this? ?.rootNodeName =? ?'js_oo'? ?;

????????? ?this? ?.className =? ?'demo_container'? ?;

????????? ?this? ?.title = title;

????????? ?this? ?.index = index;

????? ?},

????? ?getScript :? ?function? ?(){

????????? ?throw? ?new? ?Error(? ?'The method must be implemented sub class!'? ?);

????? ?}

});

// Define sub class.

var? ?TestComponent = ClassFactory.createClass(SuperComponent, {

????? ?getScript :? ?function? ?(){

????????? ?var? ?_script =? ?new? ?StringBuffer();

????????? ?_script.append(? ?this? ?.title);

????????? ?return? ?_script.toString();

????? ?}

});

?????

var? ?testComponent =? ?new? ?TestComponent(? ?"TestComponent"? ?, 2);

?

// Output

new? ?StringBuffer(? ?'testComponent.constructor = '? ?).append(testComponent.constructor).

append(? ?';(testComponent.constructor === TestComponent) = '? ?).append((testComponent.constructor === TestComponent)).

append(? ?';(testComponent instanceof? TestComponent) = '? ?).append((testComponent? ?instanceof? ? ?TestComponent)).

append(? ?';(testComponent instanceof? SuperComponent) = '? ?).append((testComponent? ?instanceof? ? ?SuperComponent)).

append(? ?';testComponent.getScript() = '? ?).append(testComponent.getScript()).toString();

執行結果:

testComponent.constructor?=?function?(){if(this.initialize){this.initialize.apply(this,?arguments)}} (testComponent.constructor?===?TestComponent)?=?true (testComponent?instanceof??TestComponent)?=?true (testComponent?instanceof??SuperComponent)?=?true testComponent.getScript()?=?TestComponent


轉載于:https://my.oschina.net/andy0807/blog/190677

總結

以上是生活随笔為你收集整理的JavaScript基于对象编程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。