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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

古老的面向对象编程

發(fā)布時(shí)間:2025/7/25 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 古老的面向对象编程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

面向?qū)ο缶幊?/h3>

一段完整的創(chuàng)建類的示例

// 如何創(chuàng)建一個(gè)類,包含有:靜態(tài)屬性方法,公有私有屬性方法? var Book = (function(){// 靜態(tài)私有變量 var bookNum = 0; // 靜態(tài)私有方法function checkName(name){} var _book = function(id, newName, newPrice) { // 安全模式,防止未使用new操作符if(this instanceof _book){ // 私有變量 方法 var name, price; function checkID(){} // 公有屬性,方法 this.id = id; this.getName = function(){ return name; }; this.getPrice = function(){ return price; }; this.setName = function(name){ name = name; };this.setPrice = function(price){ price = price; }; console.log(++bookNum); this.setName(newName); this.setPrice(newPrice); } else{ return new _book(id, name, price); } };_book.prototype = { // 靜態(tài)公有屬性 isJSBook: false,// 靜態(tài)共有方法 displayName: function(){ console.log(this.getName());} };return _book; }()); 使用關(guān)閉包定義靜態(tài)私有變量與方法,所有實(shí)例創(chuàng)建過(guò)程中都能訪問(wèn)到

創(chuàng)建實(shí)例時(shí),打印出累加之后的bookNum

當(dāng)替換Book(即_book)的原型之后,之前創(chuàng)建的實(shí)例指向的原型并不會(huì)改變,之后在之后創(chuàng)建Book實(shí)例時(shí)運(yùn)用新的原型

觀察b3、b4的原型

當(dāng)在原來(lái)的原型上變更之后,通過(guò)該原型創(chuàng)建的實(shí)例都能應(yīng)用變更之后的原型

這里定義重復(fù)了,原型上的getPrice方法將會(huì)被實(shí)例自身?yè)碛械膅etPrice方法掩蓋住

繼承

  • 方式一:類式繼承: 通過(guò)將子類的原型指定為父類的實(shí)例
function SuperClass(){ this.superValue = true; } SuperClass.prototype.getSuperValue = function(){ return this.superValue; }; function SubClass(){this.subValue = true; } SubClass.prototype = new SuperClass(); SubClass.prototype.getSubValue = function(){ return this.subValue;};

缺點(diǎn):
1、如果父類中存在引用類型屬性,則會(huì)被所有子類共用,一個(gè)子類修改之后將會(huì)影響到所有子類
2、無(wú)法在實(shí)例化時(shí)為父類傳遞初始化參數(shù)
  • 方式二: 構(gòu)造函數(shù)繼承: 在子類構(gòu)造函數(shù)中通過(guò)call或者apply調(diào)用父類的構(gòu)造函數(shù),實(shí)現(xiàn)繼承父類定義的屬性方法
function SuperClass(id){this.books = ['js', 'css', 'html'];this.id = id; } SuperClass.prototype.showBooks = function(){console.log(this.books.join()); }; function SubClass(id){SuperClass.call(this, id); }

缺點(diǎn):
1、子類沒(méi)有繼承父類的原型
2、每個(gè)實(shí)例化出來(lái)的子類對(duì)象都會(huì)單獨(dú)擁有一份父類上定義的屬性方法,無(wú)法復(fù)用父類的屬性或者方法
  • 方式三: 組合繼承: 方式一與方式二的組合模式
function SuperClass(name){this.name = name;this.books = ['js', 'css','html']; } SuperClass.prototype.getName = function(){console.log(this.name); }; function SubClass(name, time){SuperClass.call(this, name);this.time = time; } SubClass.prototype = new SuperClass(); SubClass.prototype.getTime = function(){ console.log(this.time);}

缺點(diǎn):
1、父類構(gòu)造函數(shù)執(zhí)行了兩遍
2、子類實(shí)例化出來(lái)的對(duì)象原型中重復(fù)了一次父類構(gòu)造函數(shù)中的屬性方法
  • 方式四: 原型式繼承: 使用過(guò)渡函數(shù)作為構(gòu)造函數(shù),傳入的對(duì)象作為過(guò)渡函數(shù)的原型
function inheritObject(o){function F(){}F.prototype = o;return new F(); } 缺點(diǎn):
跟方式一有相同的缺點(diǎn)
  • 方式五: 寄生式繼承: 在方式四的基礎(chǔ)上進(jìn)行二次封
function createBook(obj){var o = inheritObject(obj);o.getName = function(){console.log(this.name); };return o; }

  • 方式六: 寄生組合式繼承: 寄生式繼承跟夠構(gòu)造函數(shù)繼承的組合
function inheritPrototype(SubClass, SuperClass){var p = inheritObject(SuperClass.prototype);p.constructor = SubClass;SubClass.prototype = p; } function SuperClass(name){this.name = name;this.books = ['js', 'css','html']; } SuperClass.prototype.getName = function(){console.log(this.name); }; function SubClass(name, time){SuperClass.call(this, name);this.time = time; } inheritPrototype(SubClass, SuperClass); SubClass.prototype.getTime = function(){ console.log(this.time); }

子類添加原型方法只能在現(xiàn)有原型上一個(gè)添加

整個(gè)過(guò)程:先定義子類及父類與父類原型,然后子類原型引用父類的原型對(duì)象,然后子類在添加自己的原型方法,最后調(diào)用父類構(gòu)造函數(shù)

總結(jié)

以上是生活随笔為你收集整理的古老的面向对象编程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。