面向对象(二)

javaScript是基于原型的程序,尽量不要修改或者添加系统对象下的方法或者属性。

  • push 原理
     var arr = [1,2,3];
     Array.prototype.push = function() {
         for (var i = 0; i < arguments.length; i++) {
             //数组的第i位等于参数的第i个
             this[this.length] = arguments[i];
         }

     }
     arr.push(4,5,6)
     console.log(arr)

包装对象

基本类型都有自己对应的包装对象,然后包装对象把所有的属性和方法给了基本类型,最后包装对象消失

( Number String Boolean ) null和undefined没有
String.prototype.lastValue = function() {
  return this.charAt(this.length-1);
}

var str = 'abcdefg';
console.log(str.lastValue());//g

var str = 'hello';
str.number = 10;
console.log(str.number);//undefined

原型链

  • 原型链

实例对象与原型之间的链接,叫做原型链
proto(隐式链接)
Object对象类型是原型链的最外层

function Aaa() {
   //this.num = 20;//构造函数
}
var a1 = new Aaa();
Aaa.prototype.num = 10;// 构造函数-> 构造函数原型
Object.prototype.num = 30;//构造函数-> 构造函数原型 -> Object.prototype

console.log(a1.num);

面向对象的属性和方法

  • hasOwnProperty():判断是不是对象自身下的属性和方法

是最外层原型链的方法 Object.prototype.hasOwnProperty = function(){}

 var arr = [];
 arr.num = 10;
 Array.prototype.num2 = 20;

 console.log(arr.hasOwnProperty('num'));// true 是对象自身的属性
 console.log(arr.hasOwnProperty('num2'))// false 
 console.log(arr.hasOwnProperty == Object.prototype.hasOwnProperty)// true 证明hasOwnPropert方法是挂在最外层原型链上的
  • in

in操作符在通过对象能够访问到指定属相的时候返回 true,因此可以与hasOwnProperty相结合使用,来判断属性是不是原型上的属性。

function hasPrototypeProperty(obj,name) {
    return !obj.hasOwnProperty(name) && (name in obj);
}
  • constructor:查看对象的构造函数

每个原型都会自动添加 constructor属性
Aaa.prototype.constructor = Aaa;
for in 的时候,有些属性是找不到的(constructor)
避免修改constructor属性

注意:如过使用对象的形式简写属性,constructor的指向会改变,指向function Object() { },需要收手动修改constructor。

Bbb.prototype = {
   constructor:Bbb,
    name:'张三',
    age:29
}
  • instanceof:对象与构造函数在原型链上是否有关系
  console.log( b1 instanceof Array); //false
  console.log( b1 instanceof Object); //true
  • toString:object上的方法

把对象转成字符串
系统内置对象的toString()方法是自带的
自己写的对象的toString()方法是通过原型链找Object下面的

var arr = [];
console.log(arr.toString == Object.prototype.toString)
Bbb.prototype = {
      constructor:Bbb,
      name:'张三',
      age:29
  }
var b1 = new Bbb();
console.log( b1.toString == Object.prototype.toString)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值