JS学习笔记: 原型和对象

什么是原型

  • 构造函数中有一个属性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的方式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值