在js中,为什么要往函数的原型上添加方法/属性,而不在自己本身上面添加呢?

问题描述

如题,在js中如果我想往String这个构造函数里面添加一个首字母大写的toInitialUpperCase方法,为什么人们要往String的prototype里面添加,String.prototype.toInitialUpperCase = function () { #code... }而不是向String本身添加呢?String.toInitialUpperCase = function () { #code... }如果在原型上面添加方法,感觉又要跑多一节原型链,还不如在本身上面加来得直接,那为什么还要在原型添加呢? 问题补充:好吧,应该是构造函数里"this"的问题。

解决方案

哥们javascript中的每个对象都有prototype属性,Javascript中对象的prototype属性的解释是:返回对象类型原型的引用。 看下面的demo就明白了function baseClass(){this.showMsg = function(){ alert("baseClass::showMsg"); }}function extendClass(){}extendClass.prototype = new baseClass();instance = new extendClass();instance.showMsg(); // 显示baseClass::showMsg
解决方案二:
在本身添加会导致每次对象实例化时代码被复制,而在原型上添加相当于OO中在基类添加成员,子类实例化时可减少内存占用,也有利于代码的复用。关键还是看你添加的内容在对象层次中的复用范围
解决方案三:
其实往构造方法里面加方法是可以的,但是不够优雅,因为在new 每个string对象的时候,都会申请一块内存存放该方法,而如果是方法放在String的prototype中,则多有的string对象共用这个方法
解决方案四:
js调用某个方法,首先是在对象内部寻找方法,要是内部没有的话,则会到原型链上找,这样一直找下去,这样的也就达到了js的继承目的。

时间: 2024-10-04 00:52:07

在js中,为什么要往函数的原型上添加方法/属性,而不在自己本身上面添加呢?的相关文章

详解js中class的多种函数封装方法_javascript技巧

本文实例讲解了js中class的多种函数封装方法,分享给大家供大家参考,具体内容如下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>关于class的多种函数封装</title> <style> body{ margin: 0; } li{ height: 20px; } </style

浅析Node.js中使用依赖注入的相关问题及解决方法

这篇文章主要介绍了浅析Node.js中使用依赖注入的相关问题及解决方法,Node.js是一个将JavaScript应用运行于服务器端的框架,需要的朋友可以参考下 最近,我转向使用依赖注入来帮助理解分离代码的简单途径,并有助测试.然而,Node.js中的模块依赖Node提供的系统API,这很难判断私有依赖被恰当的使用.一般的依赖注入很难在这种情况下使用,但现在不要放弃希望. requireCauses 问题 Node.js很容易依照需求导入依赖.它运行的很好,并且比AMD模式加载器例如Requir

jsp 数据显示问题-JS中数据相加回显至JSP上精度问题

问题描述 JS中数据相加回显至JSP上精度问题 以下是显示的截图:图中的数据相加是可以正常显示的,然后下面的两项在一起的时候,就出bug了.其他的任意两项加都不会出现这种问题.在Javabean中对数据采用的是BigDecimal的格式 javabean数据处理public double getSubtotal() { BigDecimal currPrice = new BigDecimal(book.getCurrPrice() + """"); BigDeci

js中$()获取不到函数参数的值!

问题描述 <formid="logins">/////////////////////////////////////////////////////////php文件中调用的initForm函数:<scripttype="text/javascript">initForm('logins');</script>///////////////////////////////////////////////////////////j

几句话带你理解JS中的this、闭包、原型链_javascript技巧

原型链 所有对象都是基于Object.prototype,Object.prototype就是JavaScript的根对象,在Object.prototype中定义的方法都可以被其它对象访问到,当然也可以被重写了,所以直接在Object.prototype上调用的是原始功能的toString()方法,该方法会放回参数对象的内置属性[[class]]的值,这个值是个字符串,比如'[Object String]' 要理解原型链机制的话,首先得知道根本原因:JavaScript中的对象都有一个内置属性

js中function $(id)与jquery发生冲突的解决方法

$(id)是js document.getElementById(id)的简写,定义了这个方法以后调用的时候就可以直接用类似于jquery中那样的$("img-icon").onclick简单封装.所以很多人喜欢这样写:  代码如下 复制代码     var $ = function(id){     return document.getElementById(id);     }; 但是这一类js代码会和与JQuery对象获取函数冲突会与JQuery冲突的,导致JQuery获取不了

JS中判断JSON数据是否存在某字段的方法

这篇文章主要介绍了JS中如何判断JSON数据是否存在某字段,需要的朋友可以参考下 如何判断传过来的JSON数据中,某个字段是否存在, 1.obj["key"] != undefined 这种有缺陷,如果这个key定义了,并且就是很2的赋值为undefined,那么这句就会出问题了. 2.!("key" in obj) 3.obj.hasOwnProperty("key") 这两种方法就比较好了,推荐使用. 答案原文: Actually, chec

js中组合使用构造函数模式和原型模式创建对象

  js中组合构造函数模式和原型模式创建对象是最常见的方法. 构造函数模式用于定义实例属性,原型模式用于定义方法和共享属性.优点如下 ①每个实例都会有自己的一份实例属性的副本,又同时共享对方法的引用,最大限度地节省了内存. ②这种混合模式还支持向构造函数传递参数. function Student(name,age,class){  this.name = name;  this.age = age;  this.class = class;  this.friends = ["Tom"

JS中对数组元素进行增删改移的方法总结_javascript技巧

在js中对数组元素进行增删改移,简单总结了一下方法: 方法 说明 实例 push( ); 在原来数组中的元素最后面添加元素 arr.push("再见58"); unshift( ); 在原来数组中的元素最前面添加元素 arr.shift("你好58"): pop(); 移除数组中最后面的一个元素 arr.pop(); shift(); 移除数组中最前面的一个元素 arr.shift(); concat(); 拼接两个数组中的元素     (哪个数组在前面,拼接后它的