JavaScript高級程序設(shè)計

typeof

ECMAScript有5種基本類型數(shù)據(jù):

  • undefined
  • null
  • boolean
  • number
  • string

另外還有一種復(fù)雜的數(shù)據(jù)類型

  • object

typeof就是用來檢測變量的數(shù)據(jù)類型的,typeof可能會返回以下值:

  • undefined
  • boolean
  • string
  • number
  • object
  • function

instanceof

typeof操作符在檢測引用類型的值時,總是會返回object,所以用處不大。

instanceof用來檢測對象類型的,返回值是 true | false。
例如:

person instanceof Object
colors instanceof Array

函數(shù)

即使定義的時候只接收兩個參數(shù),但是調(diào)用時未必一定要傳兩個參數(shù)

原因: 參數(shù)的內(nèi)部是用一個數(shù)組(arguments)來表示的。

沒有重載:因為沒有函數(shù)簽名

數(shù)組方法

  • isArray()
  • toString() valueof() join()
  • push() pop()
  • shift() unshift()
  • sort() reverse()
  • 操作方法: slice() splice()
  • indexOf()
  • 迭代方法:every() filter() forEach() map() some()

比較常用的幾個方法:

join()
push()
slice():基于當(dāng)前數(shù)組中的一個或多個創(chuàng)建一個新數(shù)組
indexOf()
filter(function(){})
forEach(function(){})
map(function(){... return ...;} :返回一個新數(shù)組

面向?qū)ο?/h2>

數(shù)據(jù)屬性

[[configurable]] : 能否通過刪除屬性從而重新定義屬性。默認(rèn)為true
[[enumerable]] : 能否通過for-in循環(huán)返回屬性。默認(rèn)為true
[[writable]] :能否修改屬性值。默認(rèn)為true
[[value]] : 這個屬性的值。默認(rèn)為undefined

舉例:

var person={
    name:"Tangwenxing"
}

上面person對象的name屬性值被設(shè)置為Tangwenxing,也就是說它的[[value]]值被設(shè)置位Tangwenxing.

Object.defineProperty()用來修改屬性的默認(rèn)特性(configurable,enumerable,writable,value),它有三個參數(shù):

  • 屬性所在的對象
  • 屬性的名字
  • 一個描述符對象

使用方法參見如下代碼:

var person={};
Object.defineProperty(person,"name",{
    writable:false,
    value:"Tangwenxing",
    configurable:false
})

現(xiàn)在的name屬性不可以被刪除也不可以重新賦值了。

訪問屬性

主要是設(shè)置getter setter方法,因為不太重要,所以不提了。

Object.defineProperties用法

var person={}
Object.defineProperties(person,{
    name:{
        value:"Tangwenxing",
        writable:false
    },
    age:{
        value:25,
        writable:true
    }
})

Object.getOwnPropertyDescriptor用法

var descriptor = Object.getOwnPropertyDescriptor(person,"name");
alert(descriptor.writable);

原型模式

每個函數(shù)都有一個prototype屬性,這個屬性是一個指針,指向一個對象。(這句話很重要,關(guān)鍵詞是:函數(shù),prototype是一個指針)
prototype指向原型對象。
所有原型對象都會自動獲得一個construnctor屬性(這句話也很重要)

function Person(){}

Person.prototype.name="twx";
Person.prototype.age=29;
Person.prototype.sayName=function(){
    alert(this.name);
};

var person1=new Person();
var person2=new Person();

Person函數(shù)有一個prototype屬性,prototype指向一個(匿名)原型對象。

實例person1、person2指向Person.prototype.

在實例中創(chuàng)建原型中的同名屬性,會覆蓋原型中的那個屬性。

接上面的程序
...
...
alert(person1.name); //twx

person1.name = "fgh";
alert(person1.name); //fgh ——-來自實例

delete person1.name;
alert(person1.name); //twx --來自原型

hasOwnProperty()

檢測一個屬性是存在實例中還是原型中

接上面的程序
...
...
person1.hasOwnProperty("name"); //false

person1.name = "fgh";
person1.hasOwnProperty("name"); //true

delete person1.name;
person1.hasOwnProperty("name"); //false

Object.keys()

獲取對象上所有可枚舉的實例屬性

var per1Keys = Object.keys(person1);
alert(per1Keys); //name,age,sayName

更簡單的原型

function Person(){}

Person.prototype = {
    name:"twx",
    age:25,
    job:"IT",
    sayName:function(){
        alert(this.name);
    }
}

前面提到了,原型對象會自動獲取一個constructor屬性。但是在這里,我們完全重寫了原型對象,因此constructor屬性也不在是默認(rèn)的(默認(rèn)指向?qū)ο蟮臉?gòu)造函數(shù))。

因此可以這樣寫:

function Person(){}

Person.prototype = {
    constructor:Person, //讓它重新指向構(gòu)造函數(shù)
    name:"twx",
    age:25,
    job:"IT",
    sayName:function(){
        alert(this.name);
    }
}

原生對象(String Array等)的原型

定義新方法:

String.prototype.startsWith=function(text){
    return this.indexOf(text) = 0;
}

var message = "Hello World!";
msg.startWith("Hello")   //true

組合使用構(gòu)造模式和原生模式

function Person(name,age,job){
    this.name = name;
    this.age = age;
    this.job = job;
    this.friends = ['shely','Bob'];
}

Person.prototype = {
    constructor:Person,
    sayName:function(){
        alert(this.name);
    }
}

var person1 = new Person("twx",25,"IT");
var person2 = new Person("hyc",27,"SALE");

person1.friends.push("JLK");
alert(person1.friends); //'shely','Bob','JLK'
alert(person2.friends); //'shely','Bob'

alert(person1.sayName === person2.sayName);  //true
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容