js基礎(chǔ)16(面向?qū)ο蠡鹋贰㈧o態(tài)屬性和方法)

1衷畦、原型

new的特性
1.創(chuàng)建一個對象
2.new執(zhí)行函數(shù)內(nèi)部的this指向這個new創(chuàng)建的對象
3.new執(zhí)行的本次函數(shù)結(jié)束時,默認返回這個new創(chuàng)建的對象

function fun(){

};
// 這是一個原型摇锋,原型也是一個對象丹拯,所有他有對應(yīng)的類的原型
// _proto_上面
// obj.__proto__ === fun.prototype
fun.prototype = { // 為了給實例提供公有的屬性
  constructor : fun
}
const obj = new fun(); // 就是類的實例化,obj就是fun類的實例
  • 判斷一個屬性是否是原型上的荸恕,
    判斷方法:hasOwnProperty
    私有屬性返回true乖酬,在原型上的返回false
  • instanceof 用于確定obj1是上是否存在于obj2的原型鏈上
function fun(){
  this.name = arguments[0]; // 這個名字是不定餐的第一個參數(shù)
}
fun.prototype = {
  constructor: fun,
  age: 18
}
const obj = new fun("hr");
console.log(obj.hasOwnProperty("name")); // 私有屬性 true
console.log(obj.hasOwnProperty("age")); // 公有 false
function fun1(){}
console.log(obj instanceof fun1); // false
// es5
function Person(name, age){
  this.name = name;
  this.age = age;
}
Person.prototype = {
  add(value){console.log(value)}
}
const obj = new Person("hr", 18);

// es6
class Person{
  constructor(name, age){ // 就是對象,私有屬性
    this.name = name;
    this.age = age;
  }
  // 這之間不要加任何的符號
  // constructor之外的方法都是公有
  add(value){cosole.log(value)}
}
const obj = new Person("hr", 18);

2戚炫、原型繼承

繼承就是兒子要有父親的剑刑,兒子必須有父親的公有和私有屬性

// 父類,基類(模板)
function p1(opt){
  this.money = opt.money;
  this.house = opt.house;
}
p1.prototype.add = function(){
  console.log(this.name);
}
// 子類双肤,繼承父類
function p2(opt){
  p1.call(this,opt); // 繼承父類/基類的私有
  this.car = opt.car;
}
p2.prototype.add = function (){
  console.log(this.house);
}
// 第一種方案(子類繼承會破壞基類的地址施掏,不可取)
// p2.prototype = p1.prototype; // 這個是一個對象茅糜,是一個引用數(shù)據(jù)類型
// 第二種方案(__prototype__里面會顯示undefined)
// p2.prototype = new p1({});
// 第三種方案(__prototype__里面無undefined)
// function middle(){};
// middle.prototype = p1.prototype;
// p2.prototype = new middle();
// 第四種方案(不能繼承原型鏈上的屬性七芭,只能取到p1父類/基類上的屬性)
for(var key in p1.prototype){
  p2.prototype[key] = p1.prototype[key];
}
const op1 = new p1({ // 把基類這個對象存到p2的原型上
  money: "2億",
  house: "海景別墅十套",
})
const op2 = new p2({ // 我們不需要一個個傳,可以傳遞一個對象的方式
  money: "1億",
  house: "海景別墅五套",
  marry: "富婆"
})
op1.add(); // undefined
console.log(op2);

3蔑赘、對象的拷貝

原型的繼承也就是對象的繼承狸驳,其實也是對象的拷貝
對象的拷貝:

  • 淺拷貝:新對象跟原對象內(nèi)容相同预明,指向同一個地址,新對象改變耙箍,原對象也會改變
  • 深拷貝:新對象跟原對象內(nèi)容相同撰糠,但不指向同一個地址,新對象改變辩昆,原對象不會改變
  • 深淺拷貝方法(支持拷貝函數(shù))

const obj1 = {
  a: 1,
  b: ["a", "b"]  
};
// 深淺拷貝方法(支持拷貝函數(shù))
function extend(obj, deep){
  // deep: false淺拷貝  true深拷貝
  var curObj = {};
  // 判定對象是數(shù)組
  if (obj instanceof Array){
    curObj = [];
  }
  for(var key in obj){
      var value = obj[key]
      // 判斷value是否是引用類型阅酪,并且當前是深淺拷貝
      curObj[key] = (!!deep && typeof value === "object" && value !== null) ? 
            extend(value, deep) : value;
      // deep是true則為深拷貝,false是淺拷貝汁针;兩次取反deep是為了把deep轉(zhuǎn)為布爾值
      // 深拷貝术辐,則要對引用類型繼續(xù)深拷貝
  }
  return curObj;
}
// 默認是情況是淺拷貝,所以不用寫
const obj2 = extend(obj1, true);
obj2.b.push("x");
console.log(obj1);
console.log(obj2);
  • 深拷貝方法(不支持拷貝函數(shù))

const obj1 = {
  a: 1,
  b: ["a", {
    c: ["h"]
  }]
}
// 對象先轉(zhuǎn)json字符串施无,再轉(zhuǎn)為json對象
const obj2 = JSON.parse(JSON.stringify(obj1));
  • 深拷貝方法(es6)

// 父類
class p1{
  constructor(x){
    this.x = x;
  }
  add(){
    console.log(this);
  }
}
class p2 extends p1{
  constructor(x){
    super(x); // 不寫這步辉词,子類沒有this
  }
  sum(){
    console.log("hello");
  }
}
const op1 = new p1("0");
const op2 = new p2("1");
op1.add(); // {x: "0"}
op2.add(); // {x: "1"}
// op1.sum(); // 父類不會有子類自己的方法
op2.sum(); // hello

4、靜態(tài)屬性和方法

只能被類調(diào)用的屬性和方法

// es5 靜態(tài)屬性猾骡、方法
// 這是一個類
function myClass(){}
myClass.daying = function (){
  console.log("這是一個靜態(tài)方法");
}
const obj = new myClass(); // 實例

// es6  只有靜態(tài)方法
class myClass1{
  constructor(){}
   static dayjing(){} // 只能是靜態(tài)方法
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瑞躺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子卓练,更是在濱河造成了極大的恐慌隘蝎,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件襟企,死亡現(xiàn)場離奇詭異,居然都是意外死亡狮含,警方通過查閱死者的電腦和手機顽悼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來几迄,“玉大人蔚龙,你說我怎么就攤上這事∮承玻” “怎么了木羹?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長解孙。 經(jīng)常有香客問我坑填,道長,這世上最難降的妖魔是什么弛姜? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任脐瑰,我火速辦了婚禮,結(jié)果婚禮上廷臼,老公的妹妹穿的比我還像新娘苍在。我一直安慰自己绝页,他們只是感情好,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布寂恬。 她就那樣靜靜地躺著续誉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪初肉。 梳的紋絲不亂的頭發(fā)上酷鸦,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天,我揣著相機與錄音朴译,去河邊找鬼井佑。 笑死,一個胖子當著我的面吹牛眠寿,可吹牛的內(nèi)容都是我干的躬翁。 我是一名探鬼主播,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼盯拱,長吁一口氣:“原來是場噩夢啊……” “哼盒发!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起狡逢,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤宁舰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后奢浑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛮艰,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年雀彼,在試婚紗的時候發(fā)現(xiàn)自己被綠了壤蚜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡徊哑,死狀恐怖袜刷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情莺丑,我是刑警寧澤著蟹,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站梢莽,受9級特大地震影響萧豆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蟹漓,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一炕横、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧葡粒,春花似錦份殿、人聲如沸膜钓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颂斜。三九已至,卻和暖如春拾枣,著一層夾襖步出監(jiān)牢的瞬間沃疮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工梅肤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留司蔬,地道東北人。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓姨蝴,卻偏偏與公主長得像俊啼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子左医,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內(nèi)容