什么是原型
- 构造函数中有一个属性prototype,是原型, 程序员使用
实例对象中有一个属性__proto__, 是原型,浏览器使用,不是很标准 - 实例对象中的__proto__指向的就是该实例对象中的构造函数中的prototype
- 构造函数中的prototype里面的属性或者方法啊,可以直接通过实例对象调用
- 正常的写法: 实例对象.__proto__才能访问到构造函数中的prototype中的属性或方法
小案例
// 构造函数
function Person(sex, age) {
this.sex = sex;
this.age = age;
}
// 通过原型添加方法
Person.prototype.sayHi = function () {
console.log("你好");
};
var per = new Person("男", 20);
console.log(per.__proto__.constructor == Person.prototype.constructor); // 实例对象与构造函数的原型做对比 true
console.dir(Person); // 构造函数的结构
var per2 = new Person("女", 30);
console.log(per.sayHi==per2.sayHi); // true
// 实例对象中有两个属性(这两个属性是通过构造函数来获取的)
// 构造函数中并没有sex和age两个属性
原型是本身在构造函数中定义的属性和方法,当实例化对象的时候,实例对象中的属性和方法都是在自己的空间中存在的,如果是多个对象。这些属性和方法都会在单独的空间中存在,浪费内存空间,所以,为了数据共享,把想要的节省空间的属性或者方法写在原型对象中,达到了数据共享,实现了节约内存空间的作用
// 构造函数
function Person(age) {
this.age = age;
this.study = function () { // 方法,方法在原型中
console.log("I love study");
}
}
Person.prototype.sex = "男"; // 属性, 在原型中
Person.prototype.sayHi = function () {
console.log("你好");
};
// 实例化对象同时初始化
var per = new Person(18);
// console.log(per.__proto__.sex); // 男
// per.__proto__.sayHi(); // 你好
console.log(per.sex); // 男
per.sayHi(); // 你好
Person.prototype = {
// 简单的原型写法,缺少构造器
constructor: Person
};
// 为内置对象添加原型方法
String.prototype.sayHi = function () {
console.log("字符串打招呼的方法")
};
// 是一个实例对象
var str = "字符串";
str.sayHi();
// 实例对象调用属性或者方法,属性或者方法肯定是在构造函数中或者是构造函数的原型(prototype)中.
原型的写法
/* 构造函数.prototype.属性 = 值;
* 构造函数.prototype.方法 = 值 --> 函数.prototype,函数也是对象,所以,里面也有__proto__
* 实例对象.prototype --> 实例对象中没有这个属性,只有__proto__
*
* 简单的原型写法
* 缺陷: --> 新的知识点 -- 》 原型直接指向{} -->就是一个对象, 没有构造函器(constructor)
*
* 写法:
* 构造函数.prototype = {
* // 切记: 如果这种 写法,要把构造器加上
* constructor = 构造函数名称;
* }
*
* 通过原型为内置对象添加原型的属性或者方法 -- > 原因:
* 系统的内置对象属性和方法可能不满足现在需求,所以,可以通过原型的方式加入属性或者方法,为了方便开发。
* 为内置对象的原型中添加属性和方法,那么这个内置对象的实例对象就可以直接使用了
* String.prototype.方法 = 匿名函数;
* var str = "哈哈";
* str.方法 --->实例对象可以直接调用原型中的属性或者方法
*
* String.prototype.anything = function(){};
* 凡是String的实例对象都可以调用刚刚加入的方法
*/
对象
对象: 具体特质的某个事物,有特征(属性)和行为(方法)
如何创建对象?
通过调用new Object(),还有{},自定义构造函数
创建对象的方式
1. 调用系统Object() --- >创建出来的对象都是Object,不能很明确的指出这个对象是属于什么类型
var obj = new Object();
2. 字面量的方式{} -- > 只能创建一个对象(一次只能创建一个)
var obj = {
key1: value1,
key2: vaule2
}
3. 工厂模式创建对象 ---> 推论---> 自定义构造函数的方式
自定义构造函数(优化后的工厂模式)
function Obj(){
this.key = value;
}
// 实例化对象
var obj = new Obj();
自定义构造函数创建对象: 4件事
1. 在内存中申请一块空闲的空间,存储创建的对象
2. this就是当前实例化的对象
3. 设置对象中的属性和方法(为对象添加属性和方法,为属性和方法赋值)
4. 把创建后的对象返回
都是需要通过new的方式