這是我參與更文挑戰的第6天,活動詳情查看:
更文挑戰程序員
每個函數都有一個prototype屬性,它的值是一個對象正則表達式
對於普通函數來講, 它的做用不大安全
可是對於構造函數,做用:實例共享方法markdown
舉例:app
// 定義構造函數
function People(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
// 其實咱們使用布蘭達艾奇 爲咱們提供的People.prototype屬性添加方法,而且也不須要在函數中定義函數名
People.prototype.say = function() {
console.log("你好");
}
// 實例化對象
var xiaoming = new People("小明", 12, "男");
var xiaohong = new People("小紅", 12, "女");
xiaoming.say();
xiaohong.say();
console.log(xiaoming.say === xiaohong.say);
// 原型的做用: 實例共享方法
// 構造函數的方法要寫在原型上
複製代碼
該方法是檢測某個方法是否在構造函數中函數
舉例:post
// 定義一個構造函數
function People(name, age, sex) {
this.name = name;
this.age = age;
this.sex = sex;
this.say = function() {
console.log("你好");
}
}
// 方法寫在原型上
People.prototype.intro = function() {
console.log("你們好, 我今年" + this.age + "歲了");
}
// 實例化對象
var xiaoming = new People("小明", 12, "男");
var xiaohong = new People("小紅", 12, "女");
xiaoming.say();
xiaoming.intro();
xiaohong.say();
xiaohong.intro();
// 一樣是方法, 如何區別方法是在構造函數中仍是在原型上?
console.log(xiaoming.hasOwnProperty("say") ? "say在身上" : "say不在身上");
console.log(xiaohong.hasOwnProperty("intro") ? "intro在身上" : "intro不在身上");
複製代碼
定義: 不管外部如何調用類, 獲得的都是一個類的實例化對象ui
解決問題: 有些程序員,不使用new來調用構造函數,可能致使代碼出現一些問題this
舉例:spa
function People(name, age, sex) {
// 判斷this指向誰,從而決定代碼如何執行
if (this === window) {
// 說明沒有使用new來調用,而是當作普通函數來調用,若是一個普通函數中想要返回內容,須要使用return
return new People(name, age, sex);
} else {
// 說明使用new 來調用函數
this.name = name;
this.age = age;
this.sex = sex;
}
}
複製代碼
子類繼承父類的屬性和方法
繼承分爲三種:
1 類式繼承
2 構造函數式繼承
3 組合式繼承
// 定義父類
function People() {
}
People.prototype.sayHello = function(){}
// 定義子類
function Student() {
}
// 繼承
Student.prototype = new People();
// 注意補回constructor屬性
Student.prototype.constructor = Student;
複製代碼
注:其實跟繼承不要緊
// 定義父類
function People(name, age, sex) {
this.name = name;
this.age = age;
This.sex = sex;
}
People.prototype.sayHello = function(){}
// 定義子類
function Student(name, age, sex, grade) {
People.apply(this, arguments);
// 新屬性的繼承代碼必定要放在下方
this.grade = grade;
}
複製代碼
構造函數式繼承 + 類式繼承
該關鍵字用於斷定某一個對象是不是某一個構造函數的實例
使用方式:
對象 instanceof 構造函數
複製代碼
ECMAScript核心語法添加的內置構造函數:
Object、 Array、 Function、 String、 Number、 Boolean、 RegExp、 Date、 Error
複製代碼
該構造函數用於定義函數
使用方式:
接受任意個字符串參數,除了最後一個都是形參
舉例:
var fun = new Function("a", "b", "return a + b");
複製代碼
輸出fun:
等價方式1:
var fun = function() {
return a + b;
}
複製代碼
等價方式2:
function fun() {
return a + b;
}
複製代碼
特色: 若是使用new Function獲得的函數, 經過函數.name 獲得的anonymous
若是使用函數聲明式或者函數表達式打點調用name獲得的是變量名稱
函數有一個length屬性,表示的是函數在定義的時候形參的個數
argument.length,表示的是函數在執行的時候實參的個數
複製代碼
該構造函數用於定義正則表達式
使用方式:接受兩個參數
第一個參數:字符串,定義正則表達式的表達體
第二個參數: 字符串,正則表達式的修飾符 i、 g、 m
舉例:
// RegExp
var reg = /\s/g;
var reg1 = new RegExp("\\s", "g");
複製代碼
注: 因位字符串中也有轉義字符,因此在使用構造函數定義表達式的時候,要多轉義一次。