亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

淺談JavaScript的面向?qū)ο蠛退姆庋b、繼承、多態(tài)

MAX_zuo / 2082人閱讀

摘要:會(huì)造成內(nèi)存浪費(fèi)的問(wèn)題構(gòu)造函數(shù)繼承聲明父類(lèi)聲明子類(lèi)生成實(shí)例組合式繼承組合式繼承是汲取了兩者的優(yōu)點(diǎn),既避免了內(nèi)存浪費(fèi),又使得每個(gè)實(shí)例化的子類(lèi)互不影響。

寫(xiě)在前面

既然是淺談,就不會(huì)從原理上深度分析,只是幫助我們更好地理解...

面向?qū)ο笈c面向過(guò)程

面向?qū)ο蠛兔嫦蜻^(guò)程是兩種不同的編程思想,剛開(kāi)始接觸編程的時(shí)候,我們大都是從面向過(guò)程起步的,畢竟像我一樣,大家接觸的第一門(mén)計(jì)算機(jī)語(yǔ)言大概率都是C語(yǔ)言,C語(yǔ)言就是一門(mén)典型的面向過(guò)程的計(jì)算機(jī)語(yǔ)言。
面向過(guò)程主要是以動(dòng)詞為主,解決問(wèn)題的方式是按照順序一步一步調(diào)用不同的函數(shù)。
面向?qū)ο笫且悦~為主,將問(wèn)題抽象出具體的對(duì)象,而這個(gè)對(duì)象有自己的屬性和方法,在解決問(wèn)題的時(shí)候,是將不同的對(duì)象組合在一起使用。

//面向過(guò)程裝大象
1.開(kāi)(冰箱)
2.(大象)裝進(jìn)(冰箱)
3.關(guān)(冰箱)
//面向?qū)ο笱b大象
1. 冰箱.開(kāi)門(mén)()
2. 冰箱.裝進(jìn)(大象)
3. 冰箱.關(guān)門(mén)()

從這個(gè)例子可以看出,面向?qū)ο笫且灾髦^為主,將主謂堪稱(chēng)一個(gè)一個(gè)的對(duì)象,然后對(duì)象有自己的屬性和方法。
面向?qū)ο笫且怨δ軄?lái)劃分問(wèn)題的,而不是步驟。功能上的統(tǒng)一保證了面向?qū)ο笤O(shè)計(jì)的可擴(kuò)展性,解決了代碼重用性的問(wèn)題。
這也是在漫長(zhǎng)的程序設(shè)計(jì)的發(fā)展過(guò)程中得到的驗(yàn)證結(jié)果,面向?qū)ο蟮木幊趟枷胼^之于面向過(guò)程較好一點(diǎn)

封裝

面向?qū)ο笥蟹庋b、繼承和多態(tài)三大特性。
封裝:就是把事物封裝成類(lèi),隱藏事物的屬性和方法的實(shí)現(xiàn)細(xì)節(jié),僅對(duì)外公開(kāi)接口。

在ES5中,并沒(méi)有class的概念,但是由于js的函數(shù)級(jí)作用域(函數(shù)內(nèi)部的變量函數(shù)外訪(fǎng)問(wèn)不到)。所以我們可以模擬class。在es5中,類(lèi)其實(shí)就是保存了一個(gè)函數(shù)的變量,這個(gè)函數(shù)有自己的屬性和方法。將屬性和方法組成一個(gè)類(lèi)的過(guò)程就是封裝。

1.通過(guò)構(gòu)造函數(shù)添加

JavaScript提供了一個(gè)構(gòu)造函數(shù)(Constructor)模式,用來(lái)在創(chuàng)建對(duì)象時(shí)初始化對(duì)象。構(gòu)造函數(shù)其實(shí)就是普通的函數(shù),只不過(guò)有以下的特點(diǎn)

①首字母大寫(xiě)(建議構(gòu)造函數(shù)首字母大寫(xiě),即使用大駝峰命名,非構(gòu)造函數(shù)首字母小寫(xiě))
②內(nèi)部使用this
③使用new生成實(shí)例

通過(guò)構(gòu)造函數(shù)添加屬性和方法實(shí)際上也就是通過(guò)this添加的屬性和方法。因?yàn)閠his總是指向當(dāng)前對(duì)象的,所以通過(guò)this添加的屬性和方法只在當(dāng)前對(duì)象上添加,是該對(duì)象自身?yè)碛械摹K晕覀儗?shí)例化一個(gè)新對(duì)象的時(shí)候,this指向的屬性和方法都會(huì)得到相應(yīng)的創(chuàng)建,也就是會(huì)在內(nèi)存中復(fù)制一份,這樣就造成了內(nèi)存的浪費(fèi)。

function Cat(name,color){
    this.name = name;
    this.color = color;
    this.eat = (() => {
        console.log("fish!")
    })
}

//生成實(shí)例
var cat1 = new Cat("tom", "gray")

通過(guò)this定義的屬性和方法,我們實(shí)例化對(duì)象的時(shí)候斗湖重新復(fù)制一份

2.通過(guò)原型prototype封裝

在類(lèi)上通過(guò)this的方式添加屬性和方法會(huì)導(dǎo)致內(nèi)存浪費(fèi)的現(xiàn)象,有什么辦法可以讓實(shí)例化的類(lèi)所使用的屬性和方法 直接使用指針 指向同一個(gè)屬性和方法。

這就是原型的方法

JavaScript規(guī)定,每一個(gè)構(gòu)造函數(shù)都有一個(gè)prototype屬性,指向另一個(gè)對(duì)象。這個(gè)對(duì)象的所有屬性和方法,都會(huì)被構(gòu)造函數(shù)的實(shí)例繼承。
也就是說(shuō),對(duì)于那些不變的屬性和方法,我們可以直接將其添加在類(lèi)的prototype對(duì)象上。
function Cat(name,color){
            this.name = name;
            this.color = color;
        }
        Cat.prototype.type = "英短";
        Cat.prototype.eat = ( () => {
            alert("fish!")
        } )
          
        //生成實(shí)例
        var cat1 = new Cat("Tom", "gray");
        var cat2 = new Cat("Kobe", "purple");
        console.log(cat1.type); //英短
        cat2.eat(); //fish!

這時(shí)所有實(shí)例的type屬性和eat()方法,其實(shí)都是同一個(gè)內(nèi)存地址,指向prototype對(duì)象,因此就提高了運(yùn)行效率。
但是這樣做也有弊端,因?yàn)閷?shí)例化的對(duì)象的原型都是指向同一內(nèi)存地址,改動(dòng)其中一個(gè)對(duì)象的屬性可能會(huì)影響到其他的對(duì)象

es6中的類(lèi)和封裝

es6聲明一個(gè)類(lèi)
①構(gòu)造器:構(gòu)造器內(nèi)創(chuàng)建自有屬性
②方法:聲明類(lèi)實(shí)例具有的方法

class Cat {
    //等價(jià)于Cat構(gòu)造器
    constructor(name) {
        this.name = name;
    }
    //更加簡(jiǎn)單的聲明類(lèi)的內(nèi)部函數(shù)
    //等價(jià)于 Cat.prototype.eat
    eat() {
        console.log("fish!");
    }
}

//生成實(shí)例
var cat1 = new Cat("tom");
cat1.eat(); //fish!
console.log(cat1 instanceof Cat); //true
console.log(cat1 instanceof Object); //true
console.log(typeof Cat); //function
console.log(typeof Cat.prototype.eat); //function

從上面class聲明的Cat為例:Cat類(lèi)是一個(gè)具有構(gòu)造函數(shù)行為的函數(shù),其中內(nèi)部方法eat實(shí)際上就是Cat.prototype.eat()
所以說(shuō)es6的class封裝類(lèi),本質(zhì)上是es5實(shí)現(xiàn)方式的語(yǔ)法糖
最主要的區(qū)別在于,class類(lèi)的屬性是不可重新賦值和不可枚舉的,Cat.prototype就是一個(gè)只讀屬性

class和自定義類(lèi)型的區(qū)別
(1)class的聲明不會(huì)提升,與let類(lèi)似
(2)class的聲明自動(dòng)運(yùn)行于嚴(yán)格模式之下
(3)class聲明的方法不可枚舉
(4)class的內(nèi)部方法沒(méi)有 constructor 屬性,無(wú)法new
(5)調(diào)用class的構(gòu)造函數(shù)必須new
(6)class內(nèi)部方法不能同名

class類(lèi)的使用
class作為js中的一級(jí)公民,可以被當(dāng)作值來(lái)直接使用

//1.類(lèi)名作為參數(shù)傳入函數(shù)
function createObj (ClassName) {
    return new ClassName()
}

//2.立即執(zhí)行,實(shí)現(xiàn)單例模式
let cat1 = new class{
    constructor (name) {
        this.name = name
    }
    eat() {
        console.log("fish!")
    }
}("tom”)
cat1.eat() //fish!
繼承

繼承就是子類(lèi)可以使用父類(lèi)的所有功能,并且對(duì)這些功能進(jìn)行擴(kuò)展。繼承的過(guò)程,就是從一般到特殊的過(guò)程。

1.類(lèi)式繼承

所謂的類(lèi)式繼承就是使用的原型的方式,將方法添加在父類(lèi)的原型上,然后子類(lèi)的原型是父類(lèi)的一個(gè)實(shí)例化對(duì)象。

//聲明父類(lèi)
var SuperClass = function(){
    let id = 1;
    this.name = ["java"];
    this.superValue = function() {
        console.log("this is superValue!")
    }
}

//為父類(lèi)添加共有方法
SuperClass.prototype.getSuperValue = function () {
    return this.superValue();
};

//聲明子類(lèi)
var SubClass = function() {
    this.subValue = (() => {
        console.log("this is subValue!")
    })
}

//繼承父類(lèi)
SubClass.prototype = new SuperClass();

//為子類(lèi)添加共有方法
SubClass.prototype.getSubValue = function() {
    return this.subValue()
}


//生成實(shí)例
var sub1 = new SubClass();
var sub2 = new SubClass();

sub1.getSuperValue(); //this is superValue!
sub1.getSubValue(); //this is subValue!

console.log(sub1.id); //undefined
console.log(sub1.name); //["java"]

sub1.name.push("php"); 
console.log(sub1.name); //["java", "php"]
console.log(sub2.name); //["java", "php"]

其中最核心的是SubClass.prototype = new SuperClass();
類(lèi)的原型對(duì)象prototype對(duì)象的作用就是為類(lèi)的原型添加共有的方法的,但是類(lèi)不能直接訪(fǎng)問(wèn)這些方法,只有將類(lèi)實(shí)例化之后,新創(chuàng)建的對(duì)象復(fù)制了父類(lèi)構(gòu)造函數(shù)的屬性和方法,并將原型 proto 指向了父類(lèi)的原型對(duì)象。這樣子類(lèi)就可以訪(fǎng)問(wèn)父類(lèi)的屬性和方法,同時(shí),父類(lèi)中定義的屬性和方法不會(huì)被子類(lèi)繼承。

but使用類(lèi)繼承的方法,如果父類(lèi)的構(gòu)造函數(shù)中有引用數(shù)據(jù)類(lèi)型,就會(huì)在子類(lèi)中被所有實(shí)例共用,因此一個(gè)子類(lèi)的實(shí)例如果更改了這個(gè)引用數(shù)據(jù)類(lèi)型,就會(huì)影響到其他子類(lèi)的實(shí)例。

構(gòu)造函數(shù)繼承

為了克服類(lèi)繼承的缺點(diǎn),才有了構(gòu)造函數(shù)繼承,構(gòu)造函數(shù)繼承的核心思想就是SuperClass.call(this, id),直接改變this的指向,使通過(guò)this創(chuàng)建的屬性和方法在子類(lèi)中復(fù)制一份,因?yàn)槭嵌鄮?fù)制的,所以各個(gè)實(shí)例化的子類(lèi)互不影響。but會(huì)造成內(nèi)存浪費(fèi)的問(wèn)題

//構(gòu)造函數(shù)繼承
//聲明父類(lèi)

var SuperClass = function(id){
    var name = "java"
    this.languages = ["java", "php", "ruby"];
    this.id = id 
}

//聲明子類(lèi)
var SubClass = function(id){
    SuperClass.call(this, id)
}

//生成實(shí)例
var sub1 = new SubClass(1);
var sub2 = new SubClass(2);


console.log(sub2.id); // 2
console.log(sub1.name); //undefined

sub1.languages.push("python");
console.log(sub1.languages); // ["java", "php", "ruby", "python"]
console.log(sub2.languages); // ["java", "php", "ruby"]
組合式繼承

組合式繼承是汲取了兩者的優(yōu)點(diǎn),既避免了內(nèi)存浪費(fèi),又使得每個(gè)實(shí)例化的子類(lèi)互不影響。

//組合式繼承
//聲明父類(lèi)

var SuperClass = function(name){
    this.languages = ["java", "php", "ruby"];
    this.name = name;
}

 //聲明父類(lèi)原型方法
SuperClass.prototype.showLangs = function () {
    console.log(this.languages);
}

//聲明子類(lèi)
var SubClass = function(name){
    SuperClass.call(this, name)
}

//子類(lèi)繼承父類(lèi)(鏈?zhǔn)嚼^承)
SubClass.prototype = new SuperClass();

//生成實(shí)例
var sub1 = new SubClass("python");
var sub2 = new SubClass("go");

sub2.showLangs(); //["java", "php", "ruby"]
sub1.languages.push(sub1.name);
console.log(sub1.languages);//["java", "php", "ruby", "python"]
console.log(sub2.languages);//["java", "php", "ruby"]

but警告:組合式繼承方法固然好,但是會(huì)導(dǎo)致一個(gè)問(wèn)題,父類(lèi)的構(gòu)造函數(shù)會(huì)被創(chuàng)建兩次(call()的時(shí)候一遍,new的時(shí)候又一遍)

寄生組合繼承

組合式繼承的缺點(diǎn)的關(guān)鍵是 父類(lèi)的構(gòu)造函數(shù)在類(lèi)繼承和構(gòu)造函數(shù)繼承的組合形式被創(chuàng)建了兩邊,但是在類(lèi)繼承中我們并不需要?jiǎng)?chuàng)建父類(lèi)的構(gòu)造函數(shù),我們只要子類(lèi)繼承父類(lèi)的原型即可。
所以我們先給父類(lèi)的原型創(chuàng)建一個(gè)副本,然后修改子類(lèi)的 constructor 屬性,最后在設(shè)置子類(lèi)的原型就可以了

//原型式繼承
//原型式繼承其實(shí)就是類(lèi)式繼承的封裝,實(shí)現(xiàn)的功能返回一個(gè)實(shí)例,該實(shí)例的原型繼承了傳入的o對(duì)象
function inheritObject(o) {
    //聲明一個(gè)過(guò)渡函數(shù)
    function F() {}

    //過(guò)渡對(duì)象的原型鏈繼承父對(duì)象
    F.prototype = o;

    //返回一個(gè)過(guò)渡對(duì)象的實(shí)例,該實(shí)例的原型繼承了父對(duì)象
    return new F();
}

//寄生式繼承
//寄生式繼承就是對(duì)原型繼承的第二次封裝,使得子類(lèi)的原型等于父類(lèi)的原型。并且在第二次封裝的過(guò)程中對(duì)繼承的對(duì)象進(jìn)行了擴(kuò)展

function inheritPrototype(subClass, superClass){
    //復(fù)制一份父類(lèi)的原型保存在變量中,使得p的原型等于父類(lèi)的原型
    var p = inheritObject(superClass.prototype);
    //修正因?yàn)橹貙?xiě)子類(lèi)原型導(dǎo)致子類(lèi)constructor屬性被修改
    p.constructor = subClass;
    //設(shè)置子類(lèi)的原型
    subClass.prototype = p;
}

//定義父類(lèi)
var SuperClass = function(name) {
    this.name = name;
    this.languages = ["java", "php", "python"]
}
//定義父類(lèi)原型方法
SuperClass.prototype.showLangs = function() {
    console.log(this.languages);
}

//定義子類(lèi)
var SubClass = function(name) {
    SuperClass.call(this,name)
}

inheritPrototype(SubClass, SuperClass);

var sub1 = new SubClass("go");
es6中的繼承
class SuperClass {
    constructor(name) {
        this.name = name
        this.languages = ["java", "php", "go"]; 
    }
    showLangs() {
        console.log(this.languages);
    }
}

class SubClass extends SuperClass {
    constructor(name) {
        super(name)
    }

    //重寫(xiě)父類(lèi)中的方法
    showLangs() {
        this.languages.push(this.name)
        console.log(this.languages);
    }
}

//生成實(shí)例
var sub = new SubClass("韓二虎");

console.log(sub.name); //韓二虎

sub.showLangs(); //["java", "php", "go", "韓二虎"]
多態(tài)

多態(tài)實(shí)際上是不同對(duì)象作用與同一操作產(chǎn)生不同的效果。多態(tài)的思想實(shí)際上是把 “想做什么” 和 “誰(shuí)去做” 分開(kāi)。
多態(tài)的好處在于,你不必再向?qū)ο笤?xún)問(wèn)“你是什么類(lèi)型”后根據(jù)得到的答案再去調(diào)用對(duì)象的某個(gè)行為。你盡管去調(diào)用這個(gè)行為就是了,其他的一切可以由多態(tài)來(lái)負(fù)責(zé)。規(guī)范來(lái)說(shuō),多態(tài)最根本的作用就是通過(guò)吧過(guò)程化的條件語(yǔ)句轉(zhuǎn)化為對(duì)象的多態(tài)性,從而消除這些條件分支語(yǔ)句。
由于JavaScript中提到的關(guān)于多態(tài)的詳細(xì)介紹并不多,這里簡(jiǎn)單的通過(guò)一個(gè)例子來(lái)介紹就好

//非多態(tài)     
var hobby = function(animal){
    if(animal == "cat"){
        cat.eat()
    }else if(animal == "dog"){
        dog.eat()
    }
}

var cat = {
    eat: function() {
        alert("fish!")
    }
}

var dog = {
    eat: function() {
        alert("meat!")
    }
}

console.log(123);
hobby("cat"); //fish!
hobby("dog"); //meat!

從上面的例子能看到,雖然 hobby 函數(shù)目前保持了一定的彈性,但這種彈性很脆弱的,一旦需要替換或者增加成其他的animal,必須改動(dòng)hobby函數(shù),繼續(xù)往里面堆砌條件分支語(yǔ)句。我們把程序中相同的部分抽象出來(lái),那就是吃某個(gè)東西。然后再重新編程。

//多態(tài)     
var hobby = function(animal){
    if(animal.eat instanceof Function){
        animal.eat();
    }
}

var cat = {
    eat: function() {
        alert("fish!")
    }
}

var dog = {
    eat: function() {
        alert("meat!")
    }
}

現(xiàn)在來(lái)看這段代碼中的多態(tài)性。當(dāng)我們向兩種 animal 發(fā)出 eat 的消息時(shí),會(huì)分別調(diào)用他們的 eat 方法,就會(huì)產(chǎn)生不同的執(zhí)行結(jié)果。對(duì)象的多態(tài)性提示我們,“做什么”“怎么去做”是可以分開(kāi)的,這樣代碼的彈性就增強(qiáng)了很多。即使以后增加了其他的animal,hobby函數(shù)仍舊不會(huì)做任何改變。

//多態(tài)     
var hobby = function(animal){
    if(animal.eat instanceof Function){
        animal.eat();
    }
}

var cat = {
    eat: function() {
        alert("fish!")
    }
}

var dog = {
    eat: function() {
        alert("meat!")
    }
}

var aoteman = {
    eat: function(){
        alert("lil-monster!")
    }
}

hobby(cat); //fish!
hobby(dog); //meat!
hobby(aoteman); //lil-monster!

快樂(lè)面向?qū)ο?

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/99940.html

相關(guān)文章

  • 淺談JavaScript面向對(duì)象

    摘要:面向?qū)ο竺嫦驅(qū)ο缶幊痰娜Q(chēng)是,簡(jiǎn)稱(chēng),面向?qū)ο缶幊淌怯贸橄蠓绞絼?chuàng)建基于現(xiàn)實(shí)世界模型的一種編程模式。面向?qū)ο缶幊痰娜齻€(gè)主要特征是封裝繼承多態(tài)。 面向?qū)ο?面向?qū)ο缶幊痰娜Q(chēng)是Object Oriented Programming,簡(jiǎn)稱(chēng)OOP,面向?qū)ο缶幊淌怯贸橄蠓绞絼?chuàng)建基于現(xiàn)實(shí)世界模型的一種編程模式。面向?qū)ο缶幊炭梢钥醋鍪鞘褂靡幌盗袑?duì)象相互協(xié)作的軟件設(shè)計(jì),面向?qū)ο蟪绦蛟O(shè)計(jì)的目的是在編程中促...

    Magicer 評(píng)論0 收藏0
  • Java-001-面向對(duì)象

    摘要:?jiǎn)我宦氊?zé)原則可以看做是低耦合高內(nèi)聚在面向?qū)ο笤瓌t上的引申,將職責(zé)定義為引起變化的原因,以提高內(nèi)聚性來(lái)減少引起變化的原因。抽象的穩(wěn)定性決定了系統(tǒng)的穩(wěn)定性,因?yàn)槌橄笫遣蛔兊?,依?lài)于抽象是面向?qū)ο笤O(shè)計(jì)的精髓,也是依賴(lài)倒置原則的核心。 Java-面向?qū)ο?什么是面過(guò)程 把題分解成一個(gè)一個(gè)步驟,每個(gè)步驟用函數(shù)實(shí)現(xiàn),依次調(diào)用即可。就是說(shuō),在進(jìn)行面向過(guò)程 編程的時(shí)候,不需要考慮那么多,上來(lái)先定義一個(gè)...

    gekylin 評(píng)論0 收藏0
  • JS 面向對(duì)象(一)封裝(抽象)

    摘要:面向?qū)ο蟮娜筇攸c(diǎn)封裝,繼承,多態(tài)缺一不可。構(gòu)造函數(shù),是一種特殊的方法。特別的一個(gè)類(lèi)可以有多個(gè)構(gòu)造函數(shù),可根據(jù)其參數(shù)個(gè)數(shù)的不同或參數(shù)類(lèi)型的不同來(lái)區(qū)分它們即構(gòu)造函數(shù)的重載。 一、基本概念和背景 面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP:Object-oriented programming)是一種程序設(shè)計(jì)范型,同時(shí)也是一種程序開(kāi)發(fā)的方法。對(duì)象指的是類(lèi)的實(shí)例。面向?qū)ο?Object Oriented,OO...

    codercao 評(píng)論0 收藏0
  • JavaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐 | 01 - 面向對(duì)象JavaScript

    摘要:在中,并沒(méi)有對(duì)抽象類(lèi)和接口的支持。例如,當(dāng)對(duì)象需要對(duì)象的能力時(shí),可以有選擇地把對(duì)象的構(gòu)造器的原型指向?qū)ο?,從而達(dá)到繼承的效果。本節(jié)內(nèi)容為設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐第一章筆記。 動(dòng)態(tài)類(lèi)型語(yǔ)言 編程語(yǔ)言按數(shù)據(jù)類(lèi)型大體可以分為兩類(lèi):靜態(tài)類(lèi)型語(yǔ)言與動(dòng)態(tài)類(lèi)型語(yǔ)言。 靜態(tài)類(lèi)型語(yǔ)言在編譯時(shí)已確定變量類(lèi)型,動(dòng)態(tài)類(lèi)型語(yǔ)言的變量類(lèi)型要到程序運(yùn)行時(shí),待變量被賦值后,才具有某種類(lèi)型。 而JavaScript是一門(mén)典型...

    suxier 評(píng)論0 收藏0
  • 談?wù)勎宜斫?em>的面向對(duì)象

    摘要:眾多面向?qū)ο蟮木幊趟枷腚m不盡一致,但是無(wú)論哪種面向?qū)ο缶幊陶Z(yǔ)言都具有以下的共通功能。原型編程以類(lèi)為中心的傳統(tǒng)面向?qū)ο缶幊?,是以?lèi)為基礎(chǔ)生成新對(duì)象。而原型模式的面向?qū)ο缶幊陶Z(yǔ)言沒(méi)有類(lèi)這樣一個(gè)概念。 什么是面向?qū)ο??這個(gè)問(wèn)題往往會(huì)問(wèn)到剛畢業(yè)的新手or實(shí)習(xí)生上,也是往往作為一個(gè)技術(shù)面試的開(kāi)頭題。在這里我們不去談如何答(fu)好(yan)問(wèn)(guo)題(qu),僅談?wù)勎宜斫獾拿嫦驅(qū)ο蟆?從歷...

    avwu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<