这是第21篇笔记!
让学习“上瘾”,成为更好的自己!!!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<script>
// 一,动态原型模式
function Person(name, age, job){
this.name = name;
this.age =age;
this.job = job;
// 方法
// 动态原型模式:把所有信息都封装在了构造函数中,而通过在构造函数中初始化原型(仅在必要的情况下),有保持了同时使用构造函数和原型的优点
// 换句话讲,可以通过检查某个应该存在的方法是否有效,来决定是否需要初始化原型
// 只在sayName()方法不存在的情况下,才会将他添加到原型中,这段代码只会在初次调用构造函数时才会执行。此后,原型已经完成初始化,不在做任何事
if(typeof this.sayName != 'function'){ // 这里对原型所作的修改,能够立即在所有的实例中得到反映
Person.prototype.sayName = function(){
alert(this.name);
}
}
}
var friend = new Person('Kai', 29, 'teacher');
friend.sayName();
// 二,寄生构造函数模式
// 在前面几种模式都不适用的情况下,可以使用该种方式
// 寄生构造函数模式:创建一个函数,该函数的作用仅仅是封装创建对象的代码,然后再返回新创建的对象
// 除了使用new操作符合把包装函数叫做构造函数外,这个模式跟工厂模式一模一样
function Person(name, age, job){
var o = new Object();
o.name = name;
o.age = age;
o.job = job;
o.sayName = function(){
alert(this.name);
};
return o;
// 构造函数在不返回值的情况下,默认会返回新对象实例
// 通过在构造函数的末尾添加一个return语句,可以“重写”调用构造函数时返回的值
}
// var friend = new Person('Kai', 29, 'teacher');
// friend.sayName(); // "Kai"
// 应用:这个模式可以在特殊的情况下用来为对象创建构造函数
// 例如:创建一个具有额外方法的特殊数组,由于不能直接修改Array构造函数
function SpecialArray(){
// 创建数据
var values = new Array();
// 添加值
values.push.apply(values, arguments);
// 添加方法
values.toPipeString = function(){
return this.join('|');
};
// 返回数组
return values;
}
var colors = new SpecialArray('red', 'blue', 'green');
console.log(colors.toPipeString());
// 【注意】
// 1, 该构造函数返回的对象与在构造函数外部创建的对象没有什么不同
// 2, 不能依赖instanceof操作符来确定对象的类型(因为其类似于工厂模式)
// 3, 建议在可以使用其他模式的情况下,不要使用该模式!!!
// 三,稳妥构造函数模式
// 稳妥对象:没有公共属性,而且其方法也不引用this对象
// 应用:适合在安全的环境中(这些环境会禁止使用this and new), 或者在防止数据被其他应用程序改动时使用
// 稳妥构造函数模式与寄生构造函数模式的2点不同:
// (1) 新创建的对象的实例方法不引用this
// (2) 不使用new操作符调用构造函数
function Person(name, age, job){
// 创建要返回的对象
var o = new Object();
// 可以在这里定义私有变量和函数
// 添加方法
o.sayName = function(){
alert(name);
};
// 返回对象 --> 稳妥对象
return o;
}
var friend = Person('Kai', 29, 'teacher');
friend.sayName(); // "Kai"
// 变量friend中保存的是一个稳妥对象,而除了调用sayName()方法外,没有别的方式可以访问其数据成员
// 即使有其他代码可以给这个对象添加方法或者数据成员,但也不可能有别的方法访问传入到构造函数中的原始数据
// 【注意】
// 1, 该构造函数返回的对象与在构造函数外部创建的对象没有什么不同
// 2, 不能依赖instanceof操作符来确定对象的类型(因为其类似于工厂模式)
// 3, 建议在可以使用其他模式的情况下,不要使用该模式!!!
</script>
</body>
</html>```