计算字节长度:
function bytesLength(str){
var count = 0;
for(var i = 0;i < str.length; i++){
if(str.charCodeAt(i) > 255){
count += 2;
}else{
count ++;
}
}
return count;
}
原型介绍
- 定义:原型是function对象的一个属性,它定义了构造函数制造出的对象的公共祖先。通过该构造函数产生的对象,可以继承该原型的属性和方法。原型也是对象。”
- 利用原型特点和概念,可以提取共有属性。
- 对象如何查看原型一->隐式属性_ proto_
- 对象如何查看对象的构造函数- > constructor
//可以提取共有属性
Car.prototype.height = 1400;
Car.prototype.lang = 499;
Car.prototype.carName = "BMW";
function Car(color,owner){
this.owner = owner;
this.color = color;
}
var car = new Car('red','prt');
var car1 = new Car('green','prt1');
- 原型的增删改查
Person.prototype.lastName = "Deng";
function Person(name){
this.name = name;
}
var person = new Person("zpp")
- 修改
Person.prototype.lastName= “zxcv”;
person.lastName=“zxcv”; //会在给自己添加属性lastName但不会修改原型的 - 查
person.lastName - 删除 (不能通过后代删除修改原型的属性)
删除对象的属性:delete person.name 通过后代删除对象属性
删除原型的属性:delete person.lastName (不可以) - 增加
Person.prototype.age = “20”;
简写
// Car.prototype = {
// height = 1400,
// lang = 499,
// carName = "BMW"
// }
- 对象的构造函数: constructor
通过constructor来查看构造器,看自己是由谁创建的,可以修改
//修改constructor
Car.prototype = {
constructor : Person
}
//改变__proto__
Person.prototype.name = "Deng";
function Person(){
}
var person = new Person()
var obj = {
name:'sunny'
}
person.__proto__ = obj; //改变__proto__
两种修改原型属性的方式
- Person.prototype.name = ‘cherry’;
会立刻修改,改变了属性 - Person.prototype = {
name : ‘cherry’
}
不会立刻修改,改变了指向
原型链
- 如何构成原型链?
- 原型链上属性的增删改查
- 绝大多数对象的最终都会继承自Object.prototype
- Object.create(原型);
// Grand.prototype.__proto__ = Object.prototype;
Grand.prototype.lastName = "lihua";
function Grand(){
}
var grand = new Grand();
Father.prototype = grand;
function Father(){
this.name = "baba"
}
var father = new Father();
Son.prototype = father;
function Son(){
this.food = "banana";
}
var son = new Son();
- Object.create(原型);
create中只能添加对象和null
null和undefined没有toString();
以下对象自己重写了tostring方法,不会直接调用object的
document.write() 会调用tostring方法、
- call和apply
会改变this的指向
function Person(name,age){
//this == obj
this.name = name;
this.age = age;
}
var obj = {
}
Person.call(obj,'cheng',30);
//任何一个方法都可以用call方法,传参:指定的对象,参数
function Person(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
function Student(name,age,sex,tel,grade){
Person.call(this,name,age,sex);
thi.grade=grade;
this.tel=tel;
}
apply vs call
call需要把实参按照形参的个数传进去
apply需要传一 个arguments
改变this指向,传参类型不同
小bug
Math.ceil(); //向上取整
Math.floor(); //向下取整
Math.random();//产生(0,1)的随机数
可正常计算的范围,前16位后16位