美文网首页让前端飞Web前端之路知了·IT
js笔记三十四之原型链模式扩展(1)

js笔记三十四之原型链模式扩展(1)

作者: uplyw | 来源:发表于2018-05-30 21:46 被阅读13次

原型链模式扩展

批量设置原型上的公有属性
function Fn(){
    this.x = 100;
}
Fn.prototype.getX = function(){
};
Fn.prototype.getY = function(){
};
Fn.prototype.getZ = function(){
};
var f1 = new Fn;
  1. 起一个别名
function Fn(){
    this.x = 100;
}
var pro = Fn.prototype; 
// 把原来原型指向的地址赋值给pro,现在它们操作的是同一个内存空间
pro.getX = function(){
};
pro.getY = function(){
};
pro.getZ = function(){
};
var f1 = new Fn;
  1. 重构原型对象的方式 -> 自己新开辟一个堆内存,存储我们共有的属性和方法,把浏览器原来给Fn.prototype开辟的那个替换掉
function Fn(){
    this.x = 100;
}
Fn.prototype = {
    constructor: Fn, // 手动添加constructor
    x: function(){
        
    },
    y: function(){
        
    }
};
var f1 = new Fn;
f.a();
f.b();

//1. 只有浏览器天生给Fn.prototype 开辟的堆内存里面才有constructor,
// 而我们自己开辟的这个堆内存没有这个属性,这样constructor指向就不再是Fn而是Object了

// 为了和原来的保持一致, 我们需要手动的增加constructor的指向

console.log(f.constructor) // -> (没做任何处理之前) Object

a. 只有浏览器天生给Fn.prototype 开辟的堆内存里面才有constructor, 而我们自己开辟的这个堆内存没有这个属性,这样constructor指向就不再是Fn而是Object了
为了和原来的保持一致, 我们需要手动的增加constructor的指向

function Fn(){
    this.x = 100;
}
Fn.prototype = {
    constructor: Fn, // 手动添加constructor
    y: function(){
        
    },
    z: function(){
        
    }
};
var f1 = new Fn;
f1.y();
f1.z();
console.log(f1.constructor) // ->Fn(){ this.x = 100; }

b. 用这种方式给内置类增加公有的属性
给内置类Array增加数组去重的方法

Array.prototype = {
    constructor: Array,
    unique: function(){
        
    }
}

这种方式会把之前已经存在于原型上的属性和方法给替换掉, 所以用这种凡是修改内置类的话,浏览器是会屏蔽掉的

var ary = [1,2,2,1,2,3,4,2,1,3];
ary.sort();
console.log(ary); // -> [1, 1, 1, 2, 2, 2, 2, 3, 3, 4]

但是可以一个个的修改内置的方法,当我们通过下述方式在数组的原型上增加方法,如果方法名和原来内置的重复了,会把人家内置的修改掉 -> 以后在内置类的原型上增加方法,命名都需要加特殊的前缀;

Array.prototype.sort = function(){
    console.log(this) // this -> ary 当前要操作的这个数组  
    // [1,2,2,1,2,3,4,2,1,3]
}
var ary = [1,2,2,1,2,3,4,2,1,3];
ary.sort();
console.log(ary); // -> [1,2,2,1,2,3,4,2,1,3]

相关文章

  • js笔记三十四之原型链模式扩展(1)

    原型链模式扩展 批量设置原型上的公有属性 起一个别名 重构原型对象的方式 -> 自己新开辟一个堆内存,存储我们共...

  • 原型链模式--扩展1

    批量设置原型上的公有属性和方法: 1、起一个别名(简单): var pro=Fn.prototype;把原来原型指...

  • js笔记三十五之原型链模式扩展(2)

    在原型模式中,this常用的有两种情况: 在类中 this.xxx=xxx; this -> 当前类的实例 某一个...

  • js笔记三十六之原型链模式扩展(3)

    for in 循环在遍历的时候, 默认的话可以吧自己的私有的和在它所属类原型上扩展的属性和方法都可以遍历到, 但是...

  • web前端面试之js继承与原型链(码动未来)

    web前端面试之js继承与原型链(码动未来) 3.2.1、JavaScript原型,原型链 ? 有什么特点? 每个...

  • 廖雪峰JS小记

    (function(){})() 原型,原型链 浅谈Js原型的理解JS 原型与原型链终极详解 对象 对象:一种无序...

  • JS原型链

    1什么是JS原型链? 通过__proto__属性将对象与原型对象进行连接. 1.1 JS原型链的作用? 组成的一个...

  • JS原型链模式

    构造函数模式中拥有了类和实例的概念,并且实例和实例之间是相互独立开的即实例识别。基于函数的原型模式解决了方法和属性...

  • JavaScript进阶:原型模式

    1、前言 原型模式是指的将原型对象指向创建对象的类,使得不同的类共享原型对象的方法和属性。js中基于原型链的继承的...

  • js_继承及原型链等(四)

    js_继承及原型链等(三) 1. 继承 依赖于原型链来完成的继承 发生在对象与对象之间 原型链,如下: ==原型链...

网友评论

    本文标题:js笔记三十四之原型链模式扩展(1)

    本文链接:https://www.haomeiwen.com/subject/zyaxsftx.html