原型链工厂创建对象(三)

1,面向对象常用方法总结

- hasownproperty:用来判断对象是私有属性还是公有

//对象属性私有还是公有判断  hasOwnProperty

        function Person ( name, age){
            this.name = name ;
            this.age = age;
        }
        //扩展原型
        Person.prototype.say = function (){
            console.log(this.name);
        };

        //创建person实例
        var person = new Person("tom",28);
        //判断属性是否私有
        console.log(person.hasOwnProperty("name")); //true
        console.log(person.hasOwnProperty("say"));//false,因为say在原型中,属于公有属性
  1. in关键字
    -判断该对象是否可以使用该属性
  • in关键字帮我们判断对象是否可以找到和使用某个属性,无论自身还是原型中存在的目标属性,都返回true
 console.log("say" in person);//true字符串属性名 +空格+in+实例对象
        console.log("sex" in person); //false,找不到sex属性

        //为数组扩展size函数,用于返回数组长度
        Array.prototype.size = function(){ //数组
            return this.length;
        };
  1. 数组越界
//创建数组
        var arr = [1,2,3,4,5];
        //for in便历数组
        for(var n in arr){
            if(arr.hasOwnProperty(n)){ //解决方案,不出现函数
                console.log(arr[n]);
            }
            // console.log(n);
        //1.2.3,4,5,包含一个fuction。bug,找方法解决,有技术解决,但是不太可行,就是加一个判断,不会挨个去写判断,这也是兼容问题,从全局来看,不建议使用这种方法去解决,一般开发过程中,尽量少使用for in去便历
    }
    //数组越界,多了一个函数,一定是动了Array数组的原型,
  1. /Object[keys/getOwnproptyNames],可以获取属性的键集合或者属性集合
var pros = Object.keys(person); //找到的是实例的私有属性
        for(var n = 0; n<pros.length; n++){  //变量循环,
            console.log(pros[n] +":" +person[pros[n]]); //由于是变量,所以使用对象名+[]获取属性
        }

2,内存中的数据数据类型

3,原型链

  • 原型链:原型通过继承关系逐级连接组成的链型结构。(这里的继承原型继承,组合继承也是,因为包含原型继承)
  • 原型链:原型对象通过原型继承彼此连接组成的链型结构
  1. 从最下级函数prototype对象开始,由proto_连接各级函数原型组成的链型结构
  2. 原型链从最下级函数实例proto向上,逐级连接每个函数原型,直到Object函数的原型,而Object函数原型也是一个对象,他的proto_为null
  3. 构造函数默认都继承自object函数
  4. 每一个对象(实例),字符串和数字也是对象。都有一个proto属性指向其构造函数的原型。
    //原型链顶端是 Object的原型,因为所有构造函数默认都继承该函数。而Object原型也是一个对象,Object.prototype.proto===null
function A(){}
        //扩展原型
        A.prototype.a = function(){
            console.log("这是函数A的原型");
        };
        //构造函数B
        function B(){}

        //B继承A
        B.prototype = new A();
        B.prototype.b = function(){
            console.log("这是函数B的原型");
        };

        //构造函数C
        function C(){}

        //c继承B
        C.prototype = new B();

        C.prototype.c=function(){
            console.log("这是函数C的原型");
        };
  • ==对象属性查找原则==:首先查找自身私有属性,有则返回属性值,如果私有属性没有,沿原型链逐级向上查找,优先级逐级降低(就近原则),如果找不到就返回undefined

new 关键字做了哪些事

//创建构造函数
        function Person(name , age){
            this.name = name;
            this.age = age;
        }
        //自我介绍
        Person.prototype.say = function(){
            console.log(this.name);
        };

        //看代码执行用断点
        // var person = new Person("tom",28);
  1. 使用函数模拟new+构造函数创建实例的过程
  • 第一步创建对象
  • 公有对象(上级函数的prototype属性赋值给新对象的————proto__属性)
  • 私有对象c初始化
Person.apply(newObj,arguments);

-返回新对象

function newTest(name, age){
            //第一步创建对象
            //公有对象
            //私有对象c初始化
            //返回新对象
            var newObj = {};
            //建立实例与构造函数的关联
            newObj.__proto__= Person.prototype; //空对象的proto属性链接到Person的原型中,解决了公有属性
            //构建私有属性
            // newObj.name = name;
            // newObj.age = age;
            // Person.call(newObj,name,age);//把属性放到newObj
            Person.apply(newObj,arguments);

            //返回新对象
            return newObj;

        }
        console.log(newTest("tom",28));

对象+空串

{}+""//0
{}+100//100

工厂方式创建对象

  • 需求,批量创建同类对象
function factory(name,age){
        //创建新对象
        var newObj = {}; 
        //构建私有属性
        newObj.name = name;
        newObj.age = age;
        newObj.say = function(){
            console.log(this.name);
        };
        //返回新对象
        return newObj;
    }
    //创建实例
    var p1 = factory("tom",28);
    var p2 = factory("cat",22);
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容