这是我参与更文挑战的第6天,活动详情查看:
更文挑战
原型
每一个函数都有一个prototype属性,它的值是一个对象
对于普通函数来说, 它的作用不大
但是对于构造函数,作用:实例共享方法
举例:
// 定义构造函数
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);
// 原型的作用: 实例共享方法
// 构造函数的方法要写在原型上
复制代码
hasOwnProperty
该方法是检测某个方法是否在构造函数中
举例:
// 定义一个构造函数
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不在身上");
复制代码
安全类
定义: 无论外部如何调用类, 得到的都是一个类的实例化对象
解决问题: 有些程序员,不使用new来调用构造函数,可能导致代码出现一些问题
举例:
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
该关键字用于判定某一个对象是否是某一个构造函数的实例
使用方式:
对象 instanceof 构造函数
复制代码
内置构造函数
内置构造函数的分类
ECMAScript核心语法添加的内置构造函数:
Object、 Array、 Function、 String、 Number、 Boolean、 RegExp、 Date、 Error
复制代码
Function
该构造函数用于定义函数
使用方式:
接受任意个字符串参数,除了最后一个都是形参
举例:
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,表示的是函数在执行的时候实参的个数
复制代码
RegExp
该构造函数用于定义正则表达式
使用方式:接受两个参数
第一个参数:字符串,定义正则表达式的表达体
第二个参数: 字符串,正则表达式的修饰符 i、 g、 m
举例:
// RegExp
var reg = /\s/g;
var reg1 = new RegExp("\\s", "g");
复制代码
注: 因位字符串中也有转义字符,所以在使用构造函数定义表达式的时候,要多转义一次。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END