A. js的函数为什么也是对象,函数怎么自定义方法和属性<js权威指南>中说对象的方法通常是继承的属性
这不是很方便吗?这样就可以直接被函数做参数传到需要回调的其他函数中使用,java中的接口调用需要实例化,js就不需要了呀。
函数自定义方法,其实可以把你说的函数看做java中的类。比如:
function Example(name){this.name=name}
Example.prototype.setName=function(name){
this.name=name;
return this;
}
Example.prototype.getName=function(){
return this.name;
}
new Example('name').getName();//name
new Example('name').setName('name1').getName();//name1
无论是js中的Array,String……都有类似的prototype类型描述对象,当这些类型实例化以后可直接调用prototype中定义的方法或属性,也可覆盖。在实例化中prototype会被简单化成__proto__对象,可以通过console.log进行观察。关于继承,所有的js对象都有一个顶级的被继承对象,Object,方法有很多,通常被提到的就是定义类型函数时给prototype赋个你想继承的类型的实例化object,但这种方法很蠢,自己看书,搜索,实践吧,手机打字太累了。
B. JS中的String 对象及其属性(方法)
String 对象用于处理文本(字符串):
参数是要存储在 String 对象中或转换成原始字符串的值 ;
通过构造函数的方式也可以把数字类型转成字符串类型;
let str = new String(123456);
console.log(str);
字面量的方式去创建一个字符串
let str = 'he k'
1、属性 length 字符串的长度
整个字符串(无论是内部的空格还是外部的空格)都算成长度
console.log(str.length);
字符串有length属性 也可以被遍历
for(var i=0;i<str.length;i++){
console.log(str[i]); }
2、 charAt() 返回在指定位置的字符(注:字符串中第一个字符的下标是0)
如果写的索引位置找不到对应的字符 会返回一个空字符串
let a = str.charAt(6);
console.log(a);
3、concat() 连接字符串
会返回一个新的拼接后的字符串
let newstr = str.concat('itty');
console.log(newstr);
4、 replace() 用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串 ;
replace会把第一参数(第一个参数是属于原字符串的字符)替换成第二个参数里面内容
原来的字符串不会受到影响,会返回一个新的替换后的字符串
let str = "hello world";
let a = str.replace('world','kitty');
console.log(a,str);
let str = 'abc123qwe456';
5、/\d/正则表达式 代表字符串里面的第一个数字替换成nnn
/\d+/ 表示匹配字符串里面的所有数字当成一个整体替换成nnn
let a = str.replace(/\d+/,'nnn')
因为/\d+/ 这段正则不是全局的,所以只会改变第一个匹配项(123整体)
因为/\d/ 这段正则不是全局的,所以只会改变第一个匹配项(1)
let a = str.replace(/\d/,'n')
想让str中所有的数字都变成n
正则里面的g表示全局的意思 str.replace(/\d/g,'n') 可以把字符串里面的每一个数字都变成n
正则里面的g表示全局的意思 str.replace(/\d+/g,'n')
把字符串里面的所有数字当成一个整体都变成n
let a = str.replace(/\d/g,'n')
console.log(a);
sort会对原数组造成影响
let arr = [4,5,1,3]
let newarr = arr.sort();
console.log(arr[0]);
let str = 'abcdefg'
eg: 通过索引找到e charAt方法, 再写一个字符串 aaaa 拼接到str上 并答应出来新的字符串 , 把abcd替换成hello 并把替换后的字符串打印出来;
let str = 'abcdefg';
console.log(str.charAt(4));
let str2 = 'aaaa';
let newstr = str.concat(str2);
console.log(newstr);
let rstr = str.replace('abcd','hello')
console.log(rstr);
function fn(){
arguments 参数集合 是一个类数组
类数组不具有数组的方法 比如push
arguments.push(5)
es6里面提供了一个方法 Array.from
使用Array.from把类数组转成真正的数组,这样就可以使用数组的方法了 比如push pop
let arr = new Array()
let arr = Array.from(arguments)
arr.push(5)
console.log(arr); }
fn(1,2,3,4)
6、split() 把一个字符串分割成字符串数组
数组转字符串
let arr = [1,2,3];
let str = arr.join('-');
console.log(str);
let str = 'hello';
split()不加参数 会把hello这个整体放到数组当中
str.split('') 把hello这个字符串 用空字符串分割 转化为数组
str.split(',') 如果用字符串中不存在的字符分割 那么还是会把整体放到数组中
str.split('e') 用e当作分割符 把字符串分割成数组 ['h','llo']
str.split('l') 用l当作分割符 会变成空字符串 因为有两个l 所以会分割成用['he', '', 'o']
let arr = str.split('l');
console.log(arr);
7、 indexOf() 返回某个指定的字符串值在字符串中首次出现的位置(★首次很重要)
let str = 'hello'
str.charAt(1) => e
和数组的indexOf一样
let index = str.indexOf('l');
console.log(index);
8、lastIndexOf() 返回一个指定的字符串值最后出现的位置
let str = 'hello'
let index = str.lastIndexOf('l');
console.log(index);
9、 match() 可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配
let str = 'he123llo456';
str.match('o') 使用match来检索o 可以知道o在字符串内的信息,以数组的形式返回
比如o所在的索引,o所在的字符串和o的长度
let a = str.match('o')
console.log(a);
/\d+/ 代表匹配一段整体的数字
/\d/代表匹配一个数字 g代表全局
总体来说就是 在str字符串全局内 去查找一个一个的数字
会以一个数组的形式方式
不写g 只会返回第一个 写g 代表全局 会查找所有
let a = str.match(/\d+/g);
console.log(a);
10、 toLowerCase() 把字符串转换为小写
let str = "HELLO"
let str2 = str.toLowerCase();
console.log(str2);
11、 toUpperCase() 把字符串转换为大写
let str = 'hello'
let str2 = str.toUpperCase();
console.log(str2);
C. js定义函数对象有几种方式
在JavaScript中定义对象可以采用以下几种方式:
1.基于已有对象扩充其属性和方法
2.工厂方式
3.构造函数方式
4.原型(“prototype”)方式
5.动态原型方式
--1.基于已有对象扩充其属性和方法
object.name="zhangsan";
object.sayName=function(name)
{
this.name=name;
alert(this.name);
}
object.sayName("lisi");
--2.工厂方式
functioncreateObject()
{
varobject=newObject();
object.username="zhangsan";
object.password="123";
object.get=function()
{
alert(this.username+","+this.password);
}
returnobject;
}
varobject1=createObject();
varobject2=createObject();
object1.get();
--采用带参数的构造方法:
functioncreateObject(username,password)
{
varobject=newObject();
object.username=username;
object.password=password;
object.get=function()
{
alert(this.username+","+this.password);
}
returnobject;
}
varobject1=createObject("zhangsan","123");
object1.get();
D. 自定义对象
在Javascript中,除了js本身提供的自定义对象外(如Array、Date、Number等),用户还可以自己创建对象,这种由用户自己创建的虚敬敏对象就被称为自定义对象。
1.2.1、“字典”结构:对象的属性由键/值对的形式组成,属性名是字符串,属性值可以是任意类型。
1.2.2、原型继承:Js的自定义对象可以继承原型的属性。
1.2.3、动态结构:可动态的增添或删除对象的属性
1.2.4、引用类型:js中的对象为引用类型, 即a为一个对象,b=a,改变b的话a也会被改变。我们也称这种特性为 浅拷贝 ,这里b=a只是引用了a的地址,所以当我们改变b时,会根据地址将a也改变。
Js中创建自定义对象,主要通过三种方式:
1、对象直接量:原型为Object.prototype(也被称为字面量)。
2、构造函数:原型为构造函数的prototype属性。
3、Object.create():原型为传入的第一个参数,若第一个参数为null,以Object.prototype为原型。
这种方法适合用在某个特差枝定的作用域内
构造函数的函数名用驼峰法(即首字母大写)表示,将它与普通函数区分开来。
create方法接收两个参数,第一个参数接收创建对象的原型,可以为null,此时对象的原型为undefined;第二个参数接收一个属性描述符稿没。
序列化即是调用JSON方法,将对象转化为字符串,也可以通过反序列化将字符串转成对象。
作用:把对象转化成字符串。
作用:将json字符串转成json对象
E. JavaScript中的全局对象,内置对象和预定义对象是什么
1.全局对象是预定义的对象,作为JavaScript的全局函数和全局属性的占位符。
通过使用全局对象,可以访问所有其他所有预定义的对象、函数和属性。
全局对象不是任何对象的属性,所以它没有名称。
2.内部对象是编写自定义代码所用语言的基础,该代码基于想象实现自定义功能。
JavaScript有许多将其定义为语言的内部对象。本文介绍了一些最常用的对象,
并简要介绍了它们有哪些功能以及如何使用这些功能。
3.预定义对象这个像是select,Array等这个都是预定义对象。
F. 新手求解js的对象,属性,方法,的关系。内有具体例子
对于例1做一些解释:
通过varx=function(){}或者functionx(){}这种形式定义的函数不属于任何对象,只可以在它所属的闭包范围内通过x()这种形式来执行.
全局对象(浏览器对象模型中是Window对象)所属的函数或属性可以省略全局对象名,即window.alert()可以简写为alert()
1.在例子2中这个js自带函数和对象名的从属关系是什么?
indexOf这个方法是在String的原型中被定义的,indexOf只是被string对象所"继承".
2.在教程中看过实例。自定义对象内可以定义和这个对象相关的不同属性名。那么在例子2中的函数是否在这个对象内被定义了。
没有.
varx="abcd"这里x是一个string对象(即typeofx=='string'),因此它继承了String的原型中定义的所有方法和属性(例中indexOf是在String的原型中定义的,即String.prototype.hasOwnProperty("indexOf")).
在javascript原型链继承模型中,对象可以通过"."运算符调用它本身或者原型链中任一对象中定义的函数.
3.函数是处理数据的。 如果问题2成立了。那么在例2中是不是对象还定义了这个函数处理的数据的种类?
没有.另外,问题2不成立.
javascript是弱类型的脚本语言,函数中的参数不必定义类型,甚至不用确定个数.
4.是不是像x.indexOf(“a”,0)这种使用方法的函数必须跟随对象名?
不是的,可以通过Function.prototype.call或者Function.prototype.apply来更改函数中this的指向(可以认为是操作对象)
例如
varindexOf=String.prototype.indexOf;
indexOf.call(x,"a",0);
indexOf.apply(x,["a",0]);
5.对于图片对不对?
图片不完全正确.
参考下面的例子和图片
functionPoint(x,y){
//Point拥有x和y两个属性
this.x=x;
this.y=y;
}
Point.prototype={
//Point从它的原型中"继承"了distanceFromOrgin方法
distanceFromOrgin:function(p){
returnMath.sqrt((p.x-this.x)*(p.x-this.x)+(p.y-this.y)*(p.y-this.y));
}
};
//p1诞生,它拥有Point以及它的各级原型中定义的所有方法,包括Object的原型中定义的toString方法
varp1=newPoint(3,-4);
G. 利用js定义商品对象,包含:商品编号、商品名称、商品类别、单价、生产商等属性;还包含自定义的方法,即
function proct(no, name, type, price, factory) {
this.no = no;
this.name = name;
this.type = type;
this.price = price;
this.factory = factory;
this.print = function() {
alert(this.no);
//.........
}
}
H. JS 定义全局对象属性
如果你的 var obj={abc:"123",def:"888" } 在一个函数块(function)里面,obj就不是全局变量哦,所以,如果你确定要obj定义一个全局变量,很简单,这样写:
obj={abc:"123",def:"888" }
这样,obj彻底是个全局变量了,哪里都可以用到!
如还有疑问,请联系我哦