zoukankan      html  css  js  c++  java
  • 包装对象、对象常用操作、继承

    一、 包装对象
                 *     在js内部,当我们去调用字符串、数字、布尔值这些基本数据类型的属性或者方法的时候,js会在内部先把这些基本数据类型转成一个对应的对象类型(包装对象),然后再去调用包装对象身上的这些属性或者方法
                 * 
                 * 包装对象有
                 *     String
                 *     Number
                 *     Boolear
                 * 
                 * 注意:
                 *         1、null与undefined没有对应的包装对象
                 *         2、基本数据类型只能使用对应的包装对象身上的属性或者方法,不能添加
                 *             因为使用后,包装对象就消失了,所以只能用,不能添加
    1. var str='kaivon';
    2. console.log(str.charAt(0)); //k
    3. console.log(str.length); //6
    4. console.log(str.substring(1)); //aivon
    5. //内部执行的过程
    6. /*var str=new String('kaivon');
    7. console.log(str.length);*/
    8. var num=12.456;
    9. console.log(num.toFixed(2)); //12.46 把数字转成字符串,并用四舍五入的方法截取小数点后面的位数
    10. //内部执行的过程
    11. /*var num=new Number(12.456);
    12. console.log(num.toFixed(2));*/
    13. //基本数据类型只能用对应包装对象身上的方法或者属性,不能添加
    14. var str1='kaivon1';
    15. str1.a=12;
    16. console.log(str1.a); //undefined
    二、hasOwnProperty
                 *     作用
                 *         判断一个属性是不是自己对象身上的(主语是对象,不会找到原型更不会找到Object),(主语是原型,就只在原型身上找)
                 *     语法
                 *         对象.hasOwnProperty(属性)
                 *     参数
                 *         要检测的属性
                 *     返回值
                 *         true            自身属性
                 *         false        非自身属性
                 *     注意
                 *         1、这个方法是Object身上的方法
                 *         2、不会顺着原型链往外面去查找属性,只查找自身
    1. function Person(name){
    2. this.name=name;
    3. }
    4. Person.prototype.country='china';
    5. var p1=new Person('kaivon');
    6. console.log(p1.name); //kaivon
    7. console.log(p1.country); //china
    8. console.log(p1.hasOwnProperty('name')); //true
    9. console.log(p1.hasOwnProperty('country')); //false 因为这个属性在原型身上
    三、constructor
                 *     概念
                 *         每个对象身上都会有这个属性,默认指向该对象对应的构造函数
                 *         这个属性不是放在对象身上,放在对应的原型对象身上
                 *     作用
                 *         查看对象的构造函数(构造函数的函数名)
                 *     语法
                 *         对象.constructor
                 *     返回值
                 *         对象的构造函数
                 *     注意:
                 *         这个属性是可以被修改的
    1. function Coder(name){
    2. this.name=name;
    3. }
    4. /**Coder.prototype.age=18;
    5. Coder.prototype.sex='男';*/ //这种写法没有问题
    6. Coder.prototype={
    7. constructor:Coder, //这种写成对象的写法,会不经意间把constructor改成别的,所以也就自己把constructor设定为对应的构造函数的名字
    8. age:18,
    9. sex:'男'
    10. };
    11. console.log(c1.constructor==Coder);  //ture
     
    四、for   in
     //通过原型的方式添加的属性用for in也可以遍历出来
     //constructor属性是不能被for in遍历出来的
    1. for(var attr in obj){
    2. console.log(attr,obj[attr]);
    3. }
     //如果不想找到原型添加的属性---通过hasOwnProperty判断
    1. //如果只想遍历自己身上的属性
    2. for(var attr in arr){
    3. if(arr.hasOwnProperty(attr)){
    4. console.log(attr,arr[attr]);
    5. }
    6. }
    五、instanceof
                 *     作用
                 *         二元运算符,和==,>,<是同一类东西,用来查找对象与构造函数在原型链上有没有关系  
                 *     语法
                 *         对象 instanceof 构造函数
                 *     返回值
                 *         true            有关系
                 *         false        没关系
                 * 
                 *     可以用来做类型判断
    1. function Person(name){
    2. this.name=name;
    3. }
    4. var p1=new Person('kaivon');
    5. console.log(p1 instanceof Person); //true
    6. console.log(p1 instanceof Array); //false
    7. console.log(p1 instanceof Object); //true
    六、toString
                 *     作用
                 *         把对象类型转成字符串
                 *     注意
                 *         系统对象下的这个方法都是它对应原型对象身上的方法,自己写的对象下的这个方法是属于Object原型身上的方法
    1. //用toString做类型判断
    2. var num=0;
    3. var str='kaivon';
    4. var b=true;
    5. var n=null;
    6. var u=undefined;
    7. var arr1=[];
    8. var obj1={};
    9. var fn=function(){};
    10. var d=new Date();
    11. var re=new RegExp();
    12. console.log(Object.prototype.toString.call(num)); //[object Number]
    13. console.log(Object.prototype.toString.call(str)); //[object String]
    14. console.log(Object.prototype.toString.call(b)); //[object Boolean]
    15. console.log(Object.prototype.toString.call(n)); //[object Null]
    16. console.log(Object.prototype.toString.call(u)); //[object Undefined]
    17. console.log(Object.prototype.toString.call(arr1)); //[object Array]
    18. console.log(Object.prototype.toString.call(obj1)); //[object Object]
    19. console.log(Object.prototype.toString.call(fn)); //[object Function]
    20. console.log(Object.prototype.toString.call(d)); //[object Date]
    21. console.log(Object.prototype.toString.call(re)); //[object RegExp]
    22.            在对象原型下将对象类型转成字符串,call修正this的指向
    七、call
                 *     作用
                 *         调用函数并且改变this的指向
                 *     语法
                 *         函数名.call(thisArg,arg1,arg2...)
                 *     参数
                 *         thisArg            函数中this指向的值
                 *         arg1,arg2...        从call里的第二个参数开始,都是真正函数里的参数
                 *     返回值
                 *         undefined
                 * 
                 *     注意:thisArg的值为null或者undefined的时候,this是指向window
    1. function fn(){
    2. console.log(this);
    3. }
    4. fn(); //window
    5. fn.call(1); //this指向数字
    6. fn.call('kaivon'); //this指向字符串
    7. fn.call('true'); //this指向布尔值
    8. fn.call([1,2,3]); //this指向数组
    9. fn.call({}); //this指向对象
    10. fn.call(null); //this指向window
    11. fn.call(undefined); //this指向window
    1. function fn1(name,age){
    2. console.log(this,name,age);
    3. }
    4. fn1.call(1,'Sigo',18); //Number 'Sigo' 18
    5. fn1('Sigo',18); //window 'Sigo' 18
                apply的作用和call的作用一样只是语法不一样
                  *         函数名.call(thisArg,[arg1,arg2...])
    八、赋值与赋引用
        基本数据类型
    1. var str1='kaivon';
    2. var str2='kaivon';
    3. console.log(str1==str2); //true
    4. //基本数据类型的赋值,就是把值复制了一下
    5. var n1=2;
    6. var n2=n1+5;
    7. console.log(n1,n2); //2 7
    8. //基本数据类型的比较,比较的是值相等就相等
    9. var n3=10;
    10. var n4=10;
    11. console.log(n3==n4); //true
        复杂数据类型
    1. var obj1={a:10,b:20};
    2. var obj2={a:10,b:20};
    3. console.log(obj1==obj2); //false 数值是相同,但是内存的引用地址不一样
    4. //复杂数据类型的比较,比较的不光是值,并且还要比较引用地址,如果两个都相等,那他们就相等
    5. var obj3={a:10,b:20};
    6. var obj4=obj3;
    7. console.log(obj3==obj4); //true
    8. //复杂数据类型的赋值,它不光把值复制了一下,并且还复制了一下在内存中的引用地址
    9. var arr1=[1,2,3];
    10. var arr2=arr1;
    11. arr2.push(4); //arr2与arr1的引用地址是相同的,所以无论修改哪个,两个都会变
    12. console.log(arr2); //[1, 2, 3, 4]
    13. console.log(arr1); //[1, 2, 3, 4]
    14. var arr3=[4,5,6];
    15. var arr4=arr3;
    16. arr4=[7,8,9]; //arr4又赋值了,所以就又开了一块内存,引用地址就不一样了
    17. console.log(arr4); //[7, 8, 9]
    18. console.log(arr3); //[4, 5, 6]
    九、浅拷贝与深拷贝
    1. //拷贝就是将一个对象的值复制到另一个对象那里去,但是应用地址不一样, 所以两个对象之间就不会有关系了。
    2. //这是浅拷贝,既考虑不那么周到,如果对象的值也有对象就不适用
    3. window.onload=function(){
    4. var p1={a:1,b:20};
    5. function a(obj){
    6. var newObject={};
    7. for( attr in obj){
    8. newObject[attr]=obj[attr];
    9. }
    10. return newObject;
    11. }
    12. var p2=a(p1);
    13. p2.a=10;
    14. console.log(p2); //a: 10 b:20
    15. console.log(p1); //a:1 b:20
    16. }
    1. //深拷贝
    2. var p3={
    3. a:1,
    4. b:[20,10,30],
    5. c:{
    6. d:40
    7. }
    8. }
    9. function b(obj){
    10. var newObject={};
    11. if(typeof obj !='object'){
    12. return obj;
    13. }
    14. //如果要复制的对象里有个属性的值是数组,那复制的结果就必需还是数组
    15. if(obj instanceof Array){
    16. //obj.constructor==Array这个判断条件也可以
    17. newObject=[];
    18. }else{
    19. newObject={};
    20. }
    21. for( attr in obj){
    22. newObject[attr]=b(obj[attr])
    23. }
    24. return newObject;
    25. }
    26. var p4=b(p3);
    27. console.log(p4);
    十、继承
                  *         让一个对象拥有另一个对象的属性或者方法,并且自己添加的属性或者方法都不会影响到原来的对象
                 * 属性继承
                 *         通过call的方法调用构造函数继承属性
                 * 方法继承
                 *         通过for in的方法继承原型身上的方法
                 * 
                 * 注意:
                 *         1、继承其它对象的属性的时候,一定要用call去修正一下this的指向
                 *         2、继承其它对象的方法的时候,不能直接赋值,要用for in的方法去赋值,不然会出现对象引用的关系(引用地址 )
    继承属性
    1. function Person(name,age){
    2. this.name=name;
    3. this.age=age;
    4. }
    5. //创建一个对象
    6. function Coder(name,age,job){
    7. /*this.name=name;
    8. this.age=age;*/
    9. //Person(name,age); 直接调用函数(普通函数调用方式)的话,this指向了window,就会有问题 ,
    10. Person.call(this,name,age);
    11. this.job=job;
    12. }
    方法继承
    1. function Person(name){
    2. this.name=name;
    3. }
    4. Person.prototype.say=function(){
    5. console.log('我叫'+this.name);
    6. }
    7. var p1=new Person('Sigo');
    8. //创建一个对象
    9. function Coder(name,job){
    10. Person.call(this,name); //属性继承
    11. this.job=job;
    12. }
    13. for(var attr in Person.prototype){
    14. //Coder.prototype[attr]=Person.prototype[attr];
    15. //如果只想继承构造函数原型身上自己的方法,就需要做以下的判断
    16. if(Person.prototype.hasOwnProperty(attr)){
    17. Coder.prototype[attr]=Person.prototype[attr]; //将Person原型say的方法继承给Coder了
    18. }
    19. }
    20. Coder.prototype.coding=function(){
    21. console.log('我的工作是'+this.job+',我正在加班');
    22. }
    23. var c1=new Coder('Sigo','前端');
    24. c1.say(); //我叫Sigo
    25. p1.say(); //我叫Sigo
    26. c1.coding(); //我的工作是前端,我正在加班





  • 相关阅读:
    springmvc的执行流程
    深入理解设计模式(五):抽象工厂模式
    深入理解设计模式(四):工厂方法模式
    深入理解设计模式(三):策略模式
    写给三十岁的自己
    asp.net引用System.Speech实现语音提示
    深入理解设计模式(序):常用的7大设计原则
    深入理解设计模式(二):简单工厂模式
    深入理解设计模式(一):单例模式
    解决基于IIS的.net core HttpWebRequest 连接特别慢
  • 原文地址:https://www.cnblogs.com/CafeMing/p/6624636.html
Copyright © 2011-2022 走看看