zoukankan      html  css  js  c++  java
  • 面向对象知识笔记(一)

    //1.生成实例对象的原始模式
    // var Cat = {
    // name:'',
    // color:''
    // }
    //根据这个原型对象的规格,生成两个实例对象
    /*
    var cat1 = {}; //创建一个空对象
    cat1.name = "小花猫"; //按照原型对象的属性赋值
    cat1.color = "花色";

    var cat2 = {};
    cat2.name = "二毛";
    cat2.color = "黑色";
    */

    /*
    这就是最简单的封装了,把两个属性封装在一个对象里面,但是,这样的写法有两个缺点,
    一是如果多生成几个实例,写起来就非常麻烦;二是实例与原型之间,没有任何办法,可以看出有什么联系


    //2.原始模式的改进 我们可以写一个函数,解决代码重复的问题
    function Cat(name, color) {
    return {
    name: name,
    color: color
    }
    }

    //然后生成实例对象,就等于是在调用函数:
    var cat1 = Cat('大花猫', 'red');
    var cat2 = Cat('三毛', '蓝色');
    */
    /*

    //这种方法的问题依然是,cat1和cat2之间没有内在的联系,不能反映出他们是同一个原型对象的实例.
    //3.构造函数模式

    //为了解决从原型对象那个生成实例的问题,JavaScript提供了一个构造函数(construceotr)模式, 所谓"构造函数",其实就是一个普通函数,但是内部使用了this变量.对构造函数使用new运算符,就能生成实例,并且this变量会绑定在实例对象上,比如猫的原型对象
    function Cat(name, color) {
    this.name = name;
    this.color = color;
    }
    var cat1 = new Cat("大毛", "黄色");
    var cat2 = new Cat("二毛", "黑色");

    // alert(cat1.name);//大毛
    // alert(cat2.name);//黄色
    //此时,cat1和cat2就自动含有一个constructor属性,指向他们的构造函数
    alert(cat1.constructor == Cat);
    alert(cat2.constructor == Cat);
    //javascript还提供了一个instanceof运算符,验证原型对象与实例对象之间的关系 此处(cat1于cat2就是实例 Cat是原型)
    alert(cat1 instanceof Cat); //true 检测cat1是否是Cat的实例
    alert(cat2 instanceof Cat); //true 检测cat1是否是Cat的实例
    */
    /*
    4.构造函数模式的问题 构造函数方法虽然很好用,但是存在一个浪费内存的问题
    我们现在为Cat对象添加一个不变的属性type(种类),在添加一个方法eat(吃),那么,原型对象Cat就变成下面这样


    function Cat(name,color){
    this.nam = name;
    this.color = color;
    this.type = "猫科动物";
    this.eat = function(){
    alert('吃老鼠');
    }
    }
    //生成实例
    var cat1 = new Cat('小喵喵','白色');
    var cat2 = new Cat('小黑猫','白色');
    cat1.eat(); //吃老鼠
    //表面看这样没什么问题,但是实际上这样做,有一个很大弊端,那就是对于每一个实例,type属性和eat()方法都是一样的,每次生成的实例,都必须是重复的内容,多占用一些内存
    alert(cat1.eat == cat2.eat); //false
    */
    /*5.javascript规定

    每一个构造函数都有一个protoytpe属性,指向另一个对象,这个对象的所有属性和方法,都会被构造函数的实例继承。 也就是说可以把那些不变的属性和方法,直接定义在prototype对象上
    function Cat(name,color){
    this.name = name;
    this.coloe = color;
    }
    Cat.prototype.type = "猫科动物";
    Cat.prototype.eat = function(){
    alert('猫吃老鼠');
    }
    //生成实例

    var cat1 = new Cat('大毛','绿色');
    var cat2 = new Cat('四毛','蓝色');

    alert(cat1.type); //猫科动物
    cat1.eat();//吃老鼠
    //这时所有实例的type属性和eat()方法,其实都是同一个内存地址,指向prototype对象,因此就提高了运行效率
    alert(cat1.eat == cat2.eat) //true

    */
    /* 6.prototype模式验证方法
    6.1 isPrototypeOf()

    用来判断某个prototype对象和某个实例之间的关系 也就是说谁的原型链中是否包含了xx的原型

    6.2 hasOwnProperty()

    每个实例对象都有一个hasOwnproperty()方法。用来判断某一个属性到底是本地属性,还是继承自prototype对象的属性
    function Cat(name,color){
    this.name = name;
    this.coloe = color;
    }
    Cat.prototype.type = "猫科动物";
    Cat.prototype.eat = function(){
    alert('猫吃老鼠');
    }
    //生成实例

    var cat1 = new Cat('大毛','绿色');
    var cat2 = new Cat('四毛','蓝色');
    alert(cat1.hasOwnProperty("name")); //true
    alert(Cat.hasOwnProperty("type"));//false 继承自prototype对象的属性


    6.3 in运算符

    可以用来判断,某个实例是否含有某个属性,不管是不是本地属性

    function Cat(name,color){
    this.name = name;
    this.coloe = color;
    }
    Cat.prototype.type = "猫科动物";
    Cat.prototype.eat = function(){
    alert('猫吃老鼠');
    }
    //生成实例

    var cat1 = new Cat('大毛','绿色');
    var cat2 = new Cat('四毛','蓝色');
    alert("name" in cat1); //true
    alert("type" in cat1);//true
    in 运算符还可以用来遍历某个对象的所有属性。
    for(var prop in cat1){
    alert("cat1["+prop+"]="+cat1[prop]); //弹出这个对象的所有属性
    }

    */

  • 相关阅读:
    快排
    SQL实例
    14_可变字符串类和日期相关类
    13_String类的概述和使用
    c# json object Dictionary互转
    SQL Server 数据表给现有字段添加默认值或修改默认值
    SQL Server2008R2 死锁进程杀掉处理
    Sql Server 2008R2 查看SQL语句运行时间
    fatal: unable to access 'https://github.com/xxx': OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443
    idea出现了不能复制的问题
  • 原文地址:https://www.cnblogs.com/h5it/p/9243459.html
Copyright © 2011-2022 走看看