JavaScript高级程序设计

typeof

ECMAScript有5种基本类型数据:

  • undefined
  • null
  • boolean
  • number
  • string

另外还有一种复杂的数据类型

  • object

typeof就是用来检测变量的数据类型的,typeof可能会返回以下值:

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

instanceof

typeof操作符在检测引用类型的值时,总是会返回object,所以用处不大。

instanceof用来检测对象类型的,返回值是 true | false。
例如:

person instanceof Object
colors instanceof Array

函数

即使定义的时候只接收两个参数,但是调用时未必一定要传两个参数

原因: 参数的内部是用一个数组(arguments)来表示的。

没有重载:因为没有函数签名

数组方法

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

比较常用的几个方法:

join()
push()
slice():基于当前数组中的一个或多个创建一个新数组
indexOf()
filter(function(){})
forEach(function(){})
map(function(){... return ...;} :返回一个新数组

面向对象

数据属性

[[configurable]] : 能否通过删除属性从而重新定义属性。默认为true
[[enumerable]] : 能否通过for-in循环返回属性。默认为true
[[writable]] :能否修改属性值。默认为true
[[value]] : 这个属性的值。默认为undefined

举例:

var person={
    name:"Tangwenxing"
}

上面person对象的name属性值被设置为Tangwenxing,也就是说它的[[value]]值被设置位Tangwenxing.

Object.defineProperty()用来修改属性的默认特性(configurable,enumerable,writable,value),它有三个参数:

  • 属性所在的对象
  • 属性的名字
  • 一个描述符对象

使用方法参见如下代码:

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

现在的name属性不可以被删除也不可以重新赋值了。

访问属性

主要是设置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);

原型模式

每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象。(这句话很重要,关键词是:函数,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函数有一个prototype属性,prototype指向一个(匿名)原型对象。

实例person1、person2指向Person.prototype.

在实例中创建原型中的同名属性,会覆盖原型中的那个属性。

接上面的程序
...
...
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属性也不在是默认的(默认指向对象的构造函数)。

因此可以这样写:

function Person(){}

Person.prototype = {
    constructor:Person, //让它重新指向构造函数
    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

组合使用构造模式和原生模式

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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 227,123评论 6 528
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 97,850评论 3 412
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 174,839评论 0 373
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 62,389评论 1 308
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 71,183评论 6 405
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 54,717评论 1 320
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 42,797评论 3 436
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 41,951评论 0 285
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 48,459评论 1 330
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 40,431评论 3 354
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 42,573评论 1 365
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 38,123评论 5 355
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 43,823评论 3 344
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 34,220评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 35,475评论 1 281
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 51,155评论 3 387
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 47,560评论 2 370

推荐阅读更多精彩内容